TCP通信多发多收,和接收多个客户端消息

需求使用TCP通信的方式实现:多发多收消息

具体要求

可以使用死循环控制服务端收完消息继续等待接收下一个消息

客户端也可以使用死循环等待用户不断的输入消息

客户端一旦输入exit,则关闭客户端程序,并释放资源

先启动接收端

package TCP多发多收;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Myserver {

	public static void main(String[] args)  throws Exception{
		System.out.println("----接收端------");
		//注册端口
		ServerSocket ssK=new ServerSocket(8899);
		//创建接收端
		Socket sk=ssK.accept();
		//获取输入流
		InputStream is=sk.getInputStream();
		//封装成高级流
		BufferedReader bfr=new BufferedReader(new InputStreamReader(is));
		
		String read;
		while((read=bfr.readLine())!=null) {
			System.out.println("来自ip:"+sk.getRemoteSocketAddress()+"端口号:"+sk.getPort()+"的消息:"+read);
		}

	}

}

发送端

package TCP多发多收;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class MyClient {

	public static void main(String[] args)  throws Exception{
		System.out.println("---------发送端------");
		// 创建发送端对象
		Socket  sk=new Socket("127.0.0.1", 8899);
		//创建发送管道
		OutputStream is=sk.getOutputStream();
		//封装成高级管道
		PrintStream ps=new PrintStream(is);
		Scanner sc=new Scanner(System.in);
		while(true)
		{
			System.out.println("请您输入数据:");			
			String s=sc.nextLine();
			if("exit".equals(s)) {
				System.out.println("退出成功");
				ps.close();
				break;
			}
			ps.println(s);//发送数据
			ps.flush();//刷新管道
		
		}

	}

}

本次多发多收是如何实现的?

客户端使用循环反复地发送消息

服务端使用循环反复地接收消息

现在服务端为什么不可以同时接收多个客户端的消息?

目前服务端是单线程打的,每次只能处理一个客户端的消息

那么如何实现服务端接收多个客户端的消息呢?

主线程定义循环负责接收客户端Socke管道连接

每接收一个Socket通信管道分配一个独立的线程负责处理它。

创建一个线程类

package TCP多发多收;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Myserver {

	public static void main(String[] args)  throws Exception{
		System.out.println("----接收端------");
		//注册端口
		ServerSocket ssK=new ServerSocket(1314);
		//创建接收端,每来一个接收端,就交给一个子线程
		while(true) {
			Socket sk=ssK.accept();
			System.out.println(sk.getRemoteSocketAddress()+"上线了");
			new MymessageThread(sk).start();;
		}

	}

}

然后只需优化一下接收端即可

package TCP多发多收;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * 接收消息线程类

 */

public class MymessageThread extends Thread  {
	private Socket socket;
	public MymessageThread(Socket socket) {
		this.socket=socket;
	}
	@Override
		public void run() {	
	
		try {
				//获取输入流
				InputStream is=socket.getInputStream();
				//封装成高级流
				BufferedReader bfr=new BufferedReader(new InputStreamReader(is));
				
				String read;
				while((read=bfr.readLine())!=null) {
					System.out.println("来自ip:"+socket.getRemoteSocketAddress()+"端口号:"+socket.getPort()+"的消息:"+read);
				}
			} catch (IOException e) {
				System.out.println(socket.getRemoteSocketAddress()+"下线了");
			}
		}
	

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萌新上大分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值