一个 HelloWord 级别的 Java Socket 通信的例子通讯过程
先启动 Server 端进入一个死循环以便一直监听某端口是否有连接请求然后运行 Client 端客户端发出连接请求服务端监听到这次请求后向客户端发回接受消息连接建立启动一个线程去处理这次请求然后继续死循环监听其他请求客户端输入字符串后按回车键向服务器发送数据服务器读取数据后回复客户端数据这次请求处理完毕启动的线程消亡如果客户端接收到 OK 之外的返回数据会再次发送连接请求并发送数据服务器会为这次连接再次启动一个线程来进行响应…直到当客户端接收到的返回数据为 OK 时客户端退出
服务端源代码
[java] view plaincopyprint?
package comdefondssocketbegin;
import javaioBufferedReader;
import javaioDataInputStream;
import javaioDataOutputStream;
import javaioInputStreamReader;
import ServerSocket;
import Socket;
public class Server {
public static final int PORT = ;//监听的端口号
public static void main(String[] args) {
Systemoutprintln(服务器启动…\n)
Server server = new Server()
serverinit()
}
public void init() {
try {
ServerSocket serverSocket = new ServerSocket(PORT)
while (true) {
// 一旦有堵塞 则表示服务器与客户端获得了连接
Socket client = serverSocketaccept()
// 处理这次连接
new HandlerThread(client)
}
} catch (Exception e) {
Systemoutprintln(服务器异常 + egetMessage())
}
}
private class HandlerThread implements Runnable {
private Socket socket;
public HandlerThread(Socket client) {
socket = client;
new Thread(this)start()
}
public void run() {
try {
// 读取客户端数据
DataInputStream input = new DataInputStream(socketgetInputStream())
String clientInputStr = inputreadUTF()//这里要注意和客户端输出流的写方法对应否则会抛 EOFException
// 处理客户端数据
Systemoutprintln(客户端发过来的内容 + clientInputStr)
// 向客户端回复信息
DataOutputStream out = new DataOutputStream(socketgetOutputStream())
Systemoutprint(请输入\t)
// 发送键盘输入的一行
String s = new BufferedReader(new InputStreamReader(Systemin))readLine()
outwriteUTF(s)
outclose()
inputclose()
} catch (Exception e) {
Systemoutprintln(服务器 run 异常 + egetMessage())
} finally {
if (socket != null) {
try {
socketclose()
} catch (Exception e) {
socket = null;
Systemoutprintln(服务端 finally 异常 + egetMessage())
}
}
}
}
}
}
package comdefondssocketbegin;
import javaioBufferedReader;
import javaioDataInputStream;
import javaioDataOutputStream;
import javaioInputStreamReader;
import ServerSocket;
import Socket;
public class Server {
public static final int PORT = ;//监听的端口号
public static void main(String[] args) {
Systemoutprintln(服务器启动…\n)
Server server = new Server()
serverinit()
}
public void init() {
try {
ServerSocket serverSocket = new ServerSocket(PORT)
while (true) {
// 一旦有堵塞 则表示服务器与客户端获得了连接
Socket client = serverSocketaccept()
// 处理这次连接
new HandlerThread(client)
}
} catch (Exception e) {
Systemoutprintln(服务器异常 + egetMessage())
}
}
private class HandlerThread implements Runnable {
private Socket socket;
public HandlerThread(Socket client) {
socket = client;
new Thread(this)start()
}
public void run() {
try {
// 读取客户端数据
DataInputStream input = new DataInputStream(socketgetInputStream())
String clientInputStr = inputreadUTF()//这里要注意和客户端输出流的写方法对应否则会抛 EOFException
// 处理客户端数据
Systemoutprintln(客户端发过来的内容 + clientInputStr)
// 向客户端回复信息
DataOutputStream out = new DataOutputStream(socketgetOutputStream())
Systemoutprint(请输入\t)
// 发送键盘输入的一行
String s = new BufferedReader(new InputStreamReader(Systemin))readLine()
outwriteUTF(s)
outclose()
inputclose()
} catch (Exception e) {
Systemoutprintln(服务器 run 异常 + egetMessage())
} finally {
if (socket != null) {
try {
socketclose()
} catch (Exception e) {
socket = null;
Systemoutprintln(服务端 finally 异常 + egetMessage())
}
}
}
}
}
} 客户端源代码
[java] view plaincopyprint?
package comdefondssocketbegin;
import javaioBufferedReader;
import javaioDataInputStream;
import javaioDataOutputStream;
import javaioIOException;
import javaioInputStreamReader;
import Socket;
public class Client {
public static final String IP_ADDR = localhost;//服务器地址
public static final int PORT = ;//服务器端口号
public static void main(String[] args) {
Systemoutprintln(客户端启动…)
Systemoutprintln(当接收到服务器端字符为 \OK\ 的时候 客户端将终止\n)
while (true) {
Socket socket = null;
try {
//创建一个流套接字并将其连接到指定主机上的指定端口号
socket = new Socket(IP_ADDR PORT)
//读取服务器端数据
DataInputStream input = new DataInputStream(socketgetInputStream())
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socketgetOutputStream())
Systemoutprint(请输入 \t)
String str = new BufferedReader(new InputStreamReader(Systemin))readLine()
outwriteUTF(str)
String ret = inputreadUTF()
Systemoutprintln(服务器端返回过来的是 + ret)
// 如接收到 OK 则断开连接
if (OKequals(ret)) {
Systemoutprintln(客户端将关闭连接)
Threadsleep()
break;
}
outclose()
inputclose()
} catch (Exception e) {
Systemoutprintln(客户端异常 + egetMessage())
} finally {
if (socket != null) {
try {
socketclose()
} catch (IOException e) {
socket = null;
Systemoutprintln(客户端 finally 异常 + egetMessage())
}
}
}
}
}
}
package comdefondssocketbegin;
import javaioBufferedReader;
import javaioDataInputStream;
import javaioDataOutputStream;
import javaioIOException;
import javaioInputStreamReader;
import Socket;
public class Client {
public static final String IP_ADDR = localhost;//服务器地址
public static final int PORT = ;//服务器端口号
public static void main(String[] args) {
Systemoutprintln(客户端启动…)
Systemoutprintln(当接收到服务器端字符为 \OK\ 的时候 客户端将终止\n)
while (true) {
Socket socket = null;
try {
//创建一个流套接字并将其连接到指定主机上的指定端口号
socket = new Socket(IP_ADDR PORT)
//读取服务器端数据
DataInputStream input = new DataInputStream(socketgetInputStream())
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socketgetOutputStream())
Systemoutprint(请输入 \t)
String str = new BufferedReader(new InputStreamReader(Systemin))readLine()
outwriteUTF(str)
String ret = inputreadUTF()
Systemoutprintln(服务器端返回过来的是 + ret)
// 如接收到 OK 则断开连接
if (OKequals(ret)) {
Systemoutprintln(客户端将关闭连接)
Threadsleep()
break;
}
outclose()
inputclose()
} catch (Exception e) {
Systemoutprintln(客户端异常 + egetMessage())
} finally {
if (socket != null) {
try {
socketclose()
} catch (IOException e) {
socket = null;
Systemoutprintln(客户端 finally 异常 + egetMessage())
}
}
}
}
}
}
注意 Socket 输出流写数据方法是 writeUTF 时输入流读取相关数据要用 readUTF否则会抛 EOFException 异常具体原因请参考文后链接