`

并发Socket消息发送

阅读更多

线程安全扫盲贴四中,改了异常消息发送的方法,把调用客户端发送消息改成了直接写消息到接收消息队列中,这样虽然接收消息线程池的线程飘红,但总能堵塞堵塞着执行完。为什么客户端并发socket请求会一直卡住了呢?我也不知道。

客户端发送socket的代码如下

	/**
	 *  发送消息
	 * @param msg消息
	 * @param encoding 消息的编码格式
	 * @throws Exception
	 */
	public void sendMessage(final String msg,String encoding) throws ClientException{
		SocketFactory sf = (SocketFactory) SocketFactory.getDefault();
		String reqMsg = null;
		Socket socket = null;
		
		try {
			reqMsg = new String(msg.getBytes(encoding),Encoding.UTF8);
			socket = getSocket(sf);
			BufferedWriter bw = new BufferedWriter(
					new OutputStreamWriter(socket.getOutputStream(),Encoding.UTF8));
			PrintWriter tOut = new PrintWriter(bw);
			log.debug("正在发送报文:"+reqMsg);
			tOut.write(reqMsg);
			tOut.println();
			tOut.flush();
			log.debug("客户端消息发送完毕!等待服务器端确认: "+reqMsg);

			int totalBytesRcvd = 0;
			int bytesRcvd = 0;
			byte[] response = new byte["OK".length()];
			InputStream in = socket.getInputStream();
			while(totalBytesRcvd<response.length){
				bytesRcvd = in.read(response, totalBytesRcvd, response.length-totalBytesRcvd);
				if(bytesRcvd==-1){
					throw new ClientException("发送失败,服务器端异常关闭了socket连接: "+reqMsg);
				}
				totalBytesRcvd = totalBytesRcvd+bytesRcvd;
			}
			//增加验证服务器端返回的消息,增加之前可以并发到5w
			String rsp = new String(response,Encoding.UTF8);
			log.debug("收到服务器端返回消息:"+rsp);
			if(!rsp.equals("OK")){
				throw new ClientException("发送失败,服务器端返回消息错误: "+rsp);
			}
			socket.close();
			socket = null;
		} catch (Exception e1) {
			log.error(e1);
			throw new ClientException("向服务器端发送报文失败"+reqMsg,e1);
		} finally {
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					log.error(e);
				}
			}
		}
	}
	

 客户端的线程,并发1000个,总有最后2个就停住不执行了。

CyclicBarrier相当于一个拦截器,要指定的线程数都一起到了,再同时让他们run并发。

public class ClientRunnable implements Runnable{
	private int index = -1;
	private String msg = null;
	private CyclicBarrier barrier = null;
	

	public ClientRunnable(int i,CyclicBarrier barrier){
		this.index=i;
		this.msg = getMessage(i);
		this.barrier = barrier;
	}
	public void run() {
		IIPayrelayClient client = null;
		try {
			client = new Client();

			barrier.await();

			client.sendMessage(msg,"UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

这个问题下次再说,先下班了~~除了解决问题,就是下班最快乐咯^_^

分享到:
评论

相关推荐

    C#高并发SOCKET服务器和客户端完整工程实例源码.zip

    本示例源码提供了C#语言实现的高并发SOCKET服务器和客户端的完整工程实例,这为开发者提供了学习和实践网络通信机制的机会。C#作为一种强大的.NET平台语言,拥有丰富的库支持,使得构建这样的系统变得相对简单。 ...

    一个简单的socket客户端发送消息到服务器端程序

    本教程主要关注的是一个简单的TCP socket客户端如何向服务器发送消息。TCP(传输控制协议)是一种面向连接、可靠的通信协议,它保证了数据包在互联网上的顺序传输和无丢失。 首先,我们需要了解TCP Socket的基本...

    C#实现Socket高性能、大容量并发(附完整实例源码)

    C#作为.NET框架的主要编程语言,提供了强大的Socket编程支持,使得开发者能够构建高效、大容量并发的网络应用。本文将深入探讨如何使用C#实现Socket的高性能和大容量并发处理,并基于提供的完整实例源码进行解析。 ...

    C# Socket_服务端向指定的客户端发送消息(包含服务器)

    此时,服务器可以使用这个新Socket发送和接收数据。 接下来,我们要了解"客户端"。客户端也需要创建一个Socket,但它的任务是连接到服务器。`Socket clientSocket = new Socket(AddressFamily.InterNetwork, Socket...

    epoll_高并发socket通讯_

    "epoll_高并发socket通讯_"主题深入探讨了如何利用epoll机制来处理高并发的网络通信,包括服务器端和客户端的实现。 epoll是Linux内核提供的I/O多路复用技术,它通过事件驱动的方式优化了对大量文件描述符(如...

    SuperSocket 入门,实现客户端和服务端消息互发

    - 定义一个发送消息的方法,使用`WriteAsync`或`SendAsync`方法将消息发送到服务器。 - 注册`Receive`事件,当接收到服务器的响应时触发该事件,进行数据解析和处理。 **实战步骤** 1. 配置服务端和客户端的连接...

    C# socket通信允许发送消息,图片,与文件

    本篇将深入探讨如何利用C#的Socket类进行消息、图片和文件的发送。 首先,我们要了解Socket的基本概念。Socket是网络编程中的一个抽象接口,它代表了两台计算机之间的连接。在C#中,我们可以使用System.Net.Sockets...

    java使用Socket类接收和发送数据

    本文将深入探讨如何使用Socket类接收和发送数据。 首先,我们需要理解Socket类的基本概念。Socket代表了一个网络连接,它允许客户端应用程序与远程服务器进行通信。在Java中,Socket类位于`java.net`包下,提供了...

    HPSocket 同步发送 异步 sqllite模块源码

    在本例中,结合HPSocket的异步特性,我们可以设计一个模块,使得当客户端通过HPSocket发送数据时,服务器端可以异步地将接收到的数据存入SQLite数据库,提高了整个系统的处理能力。 在实际开发中,源码分析是学习和...

    Java_Socket开发高并发小型服务器

    Java Socket 开发高并发小型服务器涉及的核心概念是网络编程中的Socket技术,以及如何利用Java语言构建能够处理大量并发连接的服务端。首先,Socket是网络通信中的一个基础概念,它为两台计算机之间的通信提供了接口...

    socket实现实时消息发送包含图片文字

    在这个“socket实现实时消息发送包含图片文字”的主题中,我们将深入探讨如何利用Socket接口来构建一个能够发送和接收包括图片和文字在内的实时消息系统。 首先,我们要了解Socket的基本概念。Socket是进程间通信的...

    c#超级Socket库SuperSocket,SOCKET多线程编程

    1. **多线程支持**:SuperSocket采用了多线程模型来处理客户端的连接,确保了服务器的高并发性能。每个客户端连接都会被分配到一个独立的工作线程,从而避免单个连接阻塞其他连接的情况。 2. **简单易用的API**:...

    c# Socket 多线程 分包 发送/接受数据

    当需要发送的数据量较大时,一次发送可能会超过Socket的缓冲区大小,这时就需要将大数据拆分成多个小的数据包(也称为帧或消息),逐个发送。同样,服务端也需要将接收到的小数据包重新组合成原始的大数据。在TCP中...

    C# socket发送(接收)文件

    本文将详细讲解如何使用C#的Socket类进行文件的发送与接收,主要围绕`SingleSendForm`和`MultiSendForm`两个程序实例展开。 首先,Socket在C#中是System.Net.Sockets命名空间下的类,它提供了在网络中进行数据传输...

    AsyncSocket.rar_4 3 2 1_socket 多线程_socket 客户端_socket高并发_多并发socke

    socket多线程并发异步通讯 1、多客户端; 2、高并发连接断开; 3、高并发异步接收发送; 4、无丢包;

    C#delphi高性能大容量SOCKET并发完成端口例子(有C#客户端)实例源码

    Delphi的异步I/O模型也允许开发者以类似的方式处理并发Socket通信,通过`PostQueuedCompletionStatus`和`GetQueuedCompletionStatus`函数来实现I/O操作的提交和接收。 此实例源码中的C#客户端可能包括以下组件:...

    Socket通讯解决并发采用线程池

    标题中提到的"Socket通讯解决并发采用线程池ThreadPool.java",可能是一个Java程序,实现了Socket通信并利用`ThreadPoolExecutor`处理并发请求。`ThreadPool.java`可能包含了线程池的配置和管理逻辑,如: 1. 初始...

    socket编程之并发服务器连接代码

    3. **数据发送与接收**:一旦连接建立,客户端可以将数据写入Socket发送给服务器,同时也可以从Socket读取服务器的响应。 4. **关闭连接**:通信完成后,客户端同样需要关闭Socket连接。 四、并发服务器优化 - **...

    Linux socket 发送数据,接收数据测试

    6. **多线程编程**:为了实现并发处理多个客户端连接,服务端可能会使用多线程或异步I/O模型。每个新连接的客户端会被分配到一个新的线程,以便同时处理多个请求。 7. **错误处理**:在实际编程中,必须处理各种...

Global site tag (gtag.js) - Google Analytics