Socket-2:
实现客户端和服务端之间的相互通信
客户端:
任务:①发送消息给服务端 ; ②从服务端那儿接收消息到客户端。服务端:
任务:①接收客户端发来的消息并转发给客户端; ②满足多个客户端发来的请求连接。 类似QQ发送消息,先发送给服务器,服务器再把我们的消息转发给我们手机上。
Client2:package v2; import 省略; public class Client { /*属性:socket*/ private Socket socket; public Client(){ try { socket = new Socket("localhost",8088); } catch (Exception e) { e.printStackTrace(); } } public void start(){//定义一个方法 try { /*创建线程对象,获取服务端发送来的数据*/ Thread t = new GetServerInfoHandler(socket); t.start();//接收服务端的消息 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter( new OutputStreamWriter(os,"utf-8"),true); Scanner sc = new Scanner(System.in); while(true){ String input = sc.next(); pw.println("客户端(发):"+input); pw.flush(); } } catch (Exception e) { e.printStackTrace(); } } //定义一个内部类对象--线程,接收 服务端发送来的数据 class GetServerInfoHandler extends Thread{ private Socket socket; public GetServerInfoHandler(Socket socket){ this.socket = socket; } public void run(){ try { 通过socket对象获取输入流,接受服务端发送的数据 。 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader( new InputStreamReader(is,"utf-8")); String line = ""; while((line=br.readLine())!=null){ System.out.println("客户端(收):"+line); } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { Client c = new Client(); c.start(); } }
服务端:Server2:
1:接受客户端发送的数据; 2: 将数据返回给客户端
package v2; import 省略; public class Server { private ServerSocket server; public Server(){ try { server = new ServerSocket(8088); } catch (Exception e) { e.printStackTrace(); } } public void start(){ try { /*循环接受多个客户端的请求连接*/ while(true){ System.out.println("--等待连接--"); Socket socket = server.accept(); int port = socket.getPort();//获取客户端的信息 InetAddress add = socket.getInetAddress(); String name = add.getHostName(); System.out.println( "客户端:"+name+",端口号:"+port+"已经连接上服务器"); Thread t = new GetClientInfoHandler(socket); t.start();//服务端接收客户端消息,并返回给客户端 } } catch (Exception e) { e.printStackTrace(); } } 定义一个内部类--线程: 处理每一个客户端的信息 接收客户端的信息和发送会给客户端 需要流,socket提供的。 class GetClientInfoHandler extends Thread{ private Socket socket; public GetClientInfoHandler(Socket socket){ this.socket = socket; } public void run(){ try { InputStream is = socket.getInputStream();// 处理客户端发送过来的数据 BufferedReader br = new BufferedReader( new InputStreamReader(is,"utf-8")); * 通过Socket对象获取输出流 * */ OutputStream os = socket.getOutputStream();作用是将收到的数据写回给客户端 PrintWriter pw = new PrintWriter( new OutputStreamWriter(os,"utf-8"),true); String line = "";//将从客户端读取的数据,发回给客户端,是一个循环操作 while((line=br.readLine())!=null){ pw.println("【服务端(收)写回给客户端】:"+line); pw.flush(); } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { Server server = new Server(); server.start(); } }
运行结果:
服务端:
--等待连接--
客户端:127.0.0.1,端口号:51691已经连接上服务器
--等待连接--
客户端:127.0.0.1,端口号:51730已经连接上服务器
--等待连接--
客户端1:
客户端2:
注意:①先运行服务端,等待客户端的连接;
②运行客户端,之后连接上服务端,就可以在客户端的界面发送消息;
③切勿以为服务端也要发送消息给客户端,实则,转发客户端的消息给客户端看见而已;