在网络编程中,最基本的操作就是在两台机器之间建立点对点通信,Socket能够帮助我们实现这个功能。其实现原理为:
服务端代码
import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(5678); 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(); } }
服务器端使用ServerSocket监听端口,等待客户端连接。当建立连接后,在while循环中接收并显示客户端的消息,然后返回"has receive..."确认消息,直到客户端输入end为止。
客户端代码
import java.net.*; import java.io.*; public class Client{ static Socket server; public static void main(String[] args)throws Exception{ server=new Socket(InetAddress.getLocalHost(),5678); 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(); } }
客户端使用Socket建立与服务器端的连接。
以上是一对一的连接方式,如果存在多个客户端要访问同一个服务端的情况,该怎么办呢?
我们可以使用多线程来解决多个客户端的情况。其实现原理为:服务器端的主线程一直监听端口。当接收到一个客户端的请求时,创建一个线程来处理该请求,所有处理工作都由该线程实现,主线程继续监听端口。
服务端代码
import java.io.*; import java.net.*; public class Server extends Thread{ private Socket client; public Server(Socket client) { this.client = client; } 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 e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(5678); while (true) { Server s = new Server(server.accept()); s.start(); } } }
这样,同一个服务器端可以为多个客户端服务。