Socket-2 实现客户端与服务端的相互通信

         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:

注意:①先运行服务端,等待客户端的连接;
          ②运行客户端,之后连接上服务端,就可以在客户端的界面发送消息;
          ③切勿以为服务端也要发送消息给客户端,实则,转发客户端的消息给客户端看见而已;





猜你喜欢

转载自blog.csdn.net/xiaozelulu/article/details/80271772