Socket通信简介
Java Socket可实现客户端-服务端的双向实时通信。在java.net包中定义了两个类socket和serversocket分别实现双向连接的client和server端。
Socket通信实现方式
服务器端(非多线程)
实现流程:
- 用指定的端口实例化一个ServerSocket对象,服务器可以通过这个端口监听从客户端发来的连接请求;
- 调用ServerSocket的
accept()
方法,监听连接从端口来的请求,此方法是阻塞的; - 利用accept方法返回的客户端socket对象进行读写IO操作;
- 关闭Socket对象。
代码:
public class ServerS {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(11111);
Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while (true) {
String str = in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if (str.equals("end"))
break;
}
client.close();
}
}
客户端
实现流程:
- 用服务器端提供的IP地址和端口进行实例化;
- 调用
connect()
方法,连接服务器; - 获取Socket上面的流,封装到进BufferedReader/PrintWriter的实例,以进行读写;
- 利用Socket提供的getInputStream和getOutputStream方法,和服务器进行交互;
- 关闭Socket对象。
代码:
public class Client {
public static void main(String[] args) throws Exception, Exception {
Socket server = new Socket(InetAddress.getLocalHost(), 11111);
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
if (str.equals("end")) {
break;
}
System.out.println(in.readLine());
}
server.close();
}
}
服务器端(多线程)
实现流程:
- 服务器端创建ServerSocket,循环调用
accept()
等待客户端连接; - 客户端创建Socket并请求和服务器端连接;
- 服务器端接受客户端请求,创建ServerSocket与该客户建立连接;
- 建立连接的两个Socket在一个单独的线程上对话;
- 服务器端继续等待新的连接。
代码:
public class MultiClient extends Thread {
private Socket client;
public MultiClient(Socket c) {
this.client = c;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while (true) {
String str = in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if (str.equals("end"))
break;
}
client.close();
} catch (IOException ex) {
} finally {
}
}
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(11111);
while (true) {
MultiClient mc = new MultiClient(server.accept());
mc.start();
}
}
}
说明:
java方面的socket编程基本完结,下一章将介绍Android中的LocalServerSocket编程。