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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Qt TCP服务器中接受多个客户端连接,您可以使用多线程来处理每个客户端连接。下面是一个示例代码,演示如何使用Qt编写一个支持多个客户端连接TCP服务器: ```cpp // server.cpp #include <QtNetwork> #include <QThread> // 自定义客户端处理线程 class ClientThread : public QThread { public: explicit ClientThread(qintptr socketDescriptor, QObject *parent = nullptr) : QThread(parent), m_socketDescriptor(socketDescriptor) { } protected: void run() override { QTcpSocket socket; if (!socket.setSocketDescriptor(m_socketDescriptor)) { emit error(socket.error()); return; } qDebug() << "New client connected"; while (socket.state() == QAbstractSocket::ConnectedState) { if (socket.waitForReadyRead()) { QByteArray requestData = socket.readAll(); qDebug() << "Received data from client:" << requestData; // 处理接收到的数据 // ... // 发送响应数据 QByteArray responseData = "Response from server"; socket.write(responseData); } } socket.disconnectFromHost(); socket.waitForDisconnected(); qDebug() << "Client disconnected"; } signals: void error(QAbstractSocket::SocketError socketError); private: qintptr m_socketDescriptor; }; int main() { QTcpServer server; if (!server.listen(QHostAddress::Any, 1234)) { qWarning() << "Failed to start server"; return 1; } qDebug() << "Server started"; while (true) { if (server.waitForNewConnection(-1)) { qintptr socketDescriptor = server.nextPendingConnection()->socketDescriptor(); // 创建新的客户端处理线程 ClientThread *thread = new ClientThread(socketDescriptor); QObject::connect(thread, &ClientThread::finished, thread, &ClientThread::deleteLater); thread->start(); } } return 0; } ``` 在这个示例中,我们创建了一个名为`ClientThread`的自定义线程类,用于处理每个客户端连接。在`ClientThread`类中,我们重写了`run()`函数,在该函数中处理与客户端通信。每当有新的客户端连接到服务器时,我们创建一个新的`ClientThread`实例,并将客户端的套接字描述符传递给它。然后,我们连接`finished`信号到`deleteLater`槽,以便在线程完成后自动删除线程对象。最后,我们启动线程。 在主函数中,我们使用`QTcpServer`监听来自任意地址的连接,并在接收到新连接时创建一个客户端处理线程。通过使用多个线程,服务器可以同时接受和处理多个客户端连接。 请注意,这只是一个简单的示例,您可以根据自己的需求进行扩展和修改。还要注意网络编程中的错误处理和异常情况处理,这些在示例中并未完全覆盖。 希望这个示例对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小萌新上大分

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

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

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

打赏作者

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

抵扣说明:

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

余额充值