`

tcp socket实例(改进)

阅读更多
上一篇的程序服务器端只能接受一个客户端请求,本篇改为模拟多客户端程序
客户端:
package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class MultiClient {

	public static void main(String[] args) {

		MultiClient mc = new MultiClient();
		mc.sendSubsequentRequest();
	}

	private void sendSubsequentRequest() {

		for(int i=0;i<100;i++){ //模拟多个并发用户向客户端同时发送请求,其实在一台机子上还是有先后顺序的
			new Thread(new RequestSender()).start();
		}
	}

}

class RequestSender implements Runnable {

	@Override
	public void run() {
		try {
			callServer();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void callServer() throws UnknownHostException, IOException {

		int reqInt = 23;
		Socket s = new Socket("localhost", 8888); // 客户端给出IP和端口号

		InputStream is = s.getInputStream();
		OutputStream os = s.getOutputStream();
		DataInputStream dis = new DataInputStream(is);
		DataOutputStream dos = new DataOutputStream(os);

		dos.writeInt(reqInt);
		dos.flush();
		int serverInt = dis.readInt();
		System.out.println("server answer " + reqInt + "*18 = " + serverInt);
		dis.close();
		dos.close();

	}
}


服务器端:
只是加了一个while循环
package socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//简单的处理多客户端
public class MultiServer {
	public MultiServer() {

	}

	public static void main(String[] args) {
		MultiServer ms = new MultiServer();
		try {
			ms.listen(8888);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void listen(int port) throws IOException {

		ServerSocket server = new ServerSocket(port);
		while (true) {
			Socket socket = server.accept();
			InputStream is = socket.getInputStream();
			OutputStream os = socket.getOutputStream();
			DataInputStream dis = new DataInputStream(is);
			DataOutputStream dos = new DataOutputStream(os);
			int receiveInt = dis.readInt(); // 读取客户端请求
			System.out.println("The message from client is:" + receiveInt);
			dos.writeInt(receiveInt * 18); // 返回client端
			dos.flush(); // 强制清空缓冲区
			dos.close();
			dis.close();
			is.close();

		}
	}
}

简单的多客户端处理,加一个死循环即可,但如此服务器会阻塞用户的请求,即是服务器在没有处理完当前用户请求的情况下,是不能处理其他用户请求的,见改进的ModifiedServer

改进的server
package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ModifiedServer {
	
	/*
	 *处理客户端请求的线程类
	 *////////////////////////////////////////////
		class RequestHandler implements Runnable {  //处理客户端请求的类定义在服务器端类主体的内部
			private Socket socket = null;

			public RequestHandler(Socket s) {
				this.socket = s;
			}

			@Override
			public void run() {
				processRequest();
			}

			private void processRequest() {

				try {
					InputStream is = socket.getInputStream();
					OutputStream os = socket.getOutputStream();
					DataInputStream dis = new DataInputStream(is);
					DataOutputStream dos = new DataOutputStream(os);

					int receiveInt = dis.readInt(); // 读取客户端请求
					System.out.println("The message from client" +clientCount+ "is:"
							+ receiveInt);
					dos.writeInt(receiveInt * 18); // 返回client端
					dos.flush(); // 强制清空缓冲区
					dos.close();
					dis.close();
					is.close();

					delay(200l);   //模拟业务处理延时
					clientCount--; //处理完成,减少client端的数量
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			private void delay(long l) {

				try {
					Thread.sleep(l);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

		}
	////////////////////////////////////////////////////
	
	int clientCount = 0;   //客户端并发请求动态数目
	static int port = 8888;
	int maxClientCount = 200;

	public static void main(String[] args) {
		ModifiedServer ms = new ModifiedServer();
		try {
			ms.listenServer(port);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

//服务器监听方法
	private void listenServer(int port) throws IOException {
		ServerSocket server = new ServerSocket(port);
		System.out.println("Server is listening port " + port);
		while (true) {
			clientCount++;
			if (clientCount <= maxClientCount) {
				Socket socket = server.accept();  //没有客户端请求到来时,系统将在此阻塞
				new Thread(new RequestHandler(socket));
			} else {
				System.out.println("服务器所能承受的客户端请求最大并发数已经到上限!");
			}
		}

	}

}

虽然实现了多用户并发访问,但每次客户端访问,服务器端就要建立连接,花销较大,下篇请见用线程池实现套接字编程
分享到:
评论

相关推荐

    Android TCP Socket通信实例Demo源码Apk下载

    最近有个项目模块需要用到TCP Socket通讯,遇到了一个大坑,所以做了这个Demo。 本Demo主要实现了安卓(Android)TCP 客户端(Client)和服务器(Server)Demo的Socket通讯。以及对接硬件的项目数据在十六进制&&byte&&int...

    Tcp Socket client实例

    "Tcp Socket client 实例"指的是一个使用TCP协议的客户端示例程序,它通过Socket接口与服务器进行数据交互。事件驱动是一种编程模型,它使得客户端程序在接收到特定事件(如连接建立、数据接收或发送完成)时能够...

    Linux TCP socket实例

    本实例将通过两个文件——`server1.c`和`client1.c`,展示如何在Linux环境下使用C语言编写一个简单的TCP socket服务器和客户端。 **TCP套接字基础** 在Linux中,创建和操作TCP套接字主要涉及到以下几个函数: 1. ...

    C# TCP Socket 通讯 实例

    - `new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)`:用于创建一个新的Socket实例,指定IPv4地址族、流式Socket类型和TCP协议。 - `Connect()`:客户端用于连接到服务器的指定端口...

    三菱Q系列PLC TCP socket通讯实例程序加技术文档

    资源名:三菱Q系列PLC TCP socket通讯实例程序加技术文档 资源类型:程序源代码 源码介绍:PLC 为三菱Q06H和QJ71E71-100模块; Socket 测试软件; 参考手册:Q 系列以太网接口模块用户手册基础篇 适合人群:新手及...

    Qt TcpSocket 通信实例

    Qt TcpSocket 通信实例

    基于TCP/IP的socket编程

    "基于TCP/IP的socket编程"是一个深入探讨如何使用socket接口进行网络通信的主题。Socket编程允许应用程序通过网络发送和接收数据,它是互联网上不同计算机之间交互的核心机制。 在给定的描述中,我们看到一个创新的...

    WIN32 TCPsocket

    总结起来,这个项目提供了一个使用QT5.1和Winsock在Windows 32位系统上实现TCPsocket通信的实例,对于学习和理解如何在QT环境下编写TCP客户端和服务器程序具有很好的参考价值。通过阅读代码、注释和实践,开发者可以...

    C# 网络编程之socket tcp 通讯demo样例

    2. 创建Socket实例:使用`new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)`创建一个Socket实例,其中`AddressFamily.InterNetwork`代表IPv4,`SocketType.Stream`表示使用TCP,`...

    Socket网络编程_TCP实例

    1. **初始化Socket对象**:通过`new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)`创建一个Socket实例。 2. **连接服务器**:使用`Connect`方法连接到远程主机。例如:`socket....

    socket文件传输(TCP)源码实例

    在这个“socket文件传输(TCP)源码实例”中,我们将深入理解如何利用TCP协议通过socket进行文件传输。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保了数据的...

    欧姆龙TCP UDP Socket网络通讯.zip

    本资源"欧姆龙TCP UDP Socket网络通讯.zip"提供了关于如何利用TCP和UDP协议通过Socket进行欧姆龙PLC设备通信的实例。以下是关于这个主题的详细知识点: 1. **Socket基础**: - Socket是一种网络编程接口,用于在...

    Linux C++ TCP Socket通信实例

    以下是一个关于"Linux C++ TCP Socket通信实例"的知识点详细说明。 首先,我们需要理解TCP Socket的基本概念。Socket是网络通信中的接口,它允许程序通过网络进行通信。在Linux系统中,我们使用`&lt;sys/socket.h&gt;`...

    TCPSOCKET 线程池通信客户端+服务器端示例代码

    总结起来,"TCPSOCKET线程池通信客户端+服务器端示例代码"是.NET开发者学习如何利用TCP SOCKET进行高效、多线程通信的宝贵资源。通过理解和实践这个示例,开发者可以更好地掌握网络编程技术,为开发高性能的网络应用...

    基于tcp的socket编程实例

    在这个"基于TCP的socket编程实例"中,我们将深入探讨如何使用socket API进行TCP通信,并通过"main"这个程序文件来理解其实现过程。 首先,TCP socket编程主要包括服务器端和客户端两部分。服务器端需要先启动,监听...

    简单的Socket实例 C# TCP

    首先,创建Socket实例,指定协议类型为Tcp。在C#中,这可以通过以下代码实现: ```csharp Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ``` 接着,我们...

    c# tcpsocket 原生代码编写 客户端和服务端程序

    1. 创建Socket实例。 2. 设置Socket属性为Stream Socket(SocketType.Stream)和TCP协议(ProtocolType.Tcp)。 3. 绑定到本地IP和端口,通常使用IPAddress.Any表示任何可用的IP,端口可以自定义,但需确保未被其他...

    QT测试tcp通讯SOCKET实例程序

    QT测试TCP通讯SOCKET实例程序是一个基于QT框架的示例应用,用于演示如何在C++环境中使用TCP/IP网络协议进行通信。QT是一个流行的开源跨平台应用程序开发框架,它提供了丰富的库支持,包括对网络编程的支持,使得...

    linux c 下TCPsocket完整实例

    本实例将详细介绍如何在C语言环境下创建和使用TCP套接字进行数据传输。 首先,我们需要理解TCP协议的基本概念。TCP是一种面向连接的、可靠的传输层协议,它提供全双工通信,确保数据的顺序传输和错误检测。在建立...

    TCP-SOCKET.zip_CSharp socket tcp_TCP socket_socket_socket server

    - 创建Socket实例:首先创建一个Socket对象,指定协议类型为SocketType.Stream,表示使用TCP协议。 - 绑定与监听:使用Bind方法绑定到特定的IP地址和端口,然后调用Listen方法开始监听连接请求。 - 接受连接:...

Global site tag (gtag.js) - Google Analytics