Socket服务端,用一个池对象来保存SocketServer接收到的socket链接。
实现过程中注意
接收客户端连接,只要客户端进行了连接,就会触发accept();从而建立连接。如下:
socket=serverSocket.accept();
此时需要new Handler(socket)一个对象,并将其放入线程池中。如下:
executorService.execute(new Handler(socket));
socket服务端,可做的内容如下:
1)根据与客户端约定好的数据格式,例如:数据的前4位代表userName,5-8位代表客户端请求服务端的methodName。等等,提供相应服务。
2)可以根据socket服务端机器的能力强弱,控制线程池大小。并提供实时的服务器链接数,从而让客户端用户能够选择压力较小的服务器进行链接。提供稳定流畅的服务。
3)可自己封装一个java.net.Socket类MySocket,在其对象里放入一个唯一标志例如客服端传递过来userName,进而实现一个userName,同时只能一个点连接上服务端。
下面是代码:
MultiThreadServer
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadServer {
private int port=8888;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=5;//单个CPU线程池大小
public MultiThreadServer() throws IOException{
serverSocket=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(POOL_SIZE);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private BufferedOutputStream getWriter(Socket socket) throws IOException
{
OutputStream socketOut = socket.getOutputStream();
BufferedOutputStream buff = new BufferedOutputStream(socketOut);
return buff;
}
private BufferedInputStream getReader(Socket socket) throws IOException
{
InputStream socketIn = socket.getInputStream();
return new BufferedInputStream(socketIn);
}
public String echo(String msg){
return "echo:"+msg;
}
public void run(){
try {
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedInputStream bis = getReader(socket);
BufferedOutputStream bos = getWriter(socket);
while (true)
{
byte[] sizeb = new byte[1024];
bis.read(sizeb);
// 根据于客户端约定好的数据格式,执行对应业务。
System.out.println(new String(sizeb));
String echo = " Hi " + socket.getInetAddress();
byte[] response = echo.getBytes();
bos.write(response); //
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
由于我们项目的客户端是C#项目,所以我就直接copy了网络上的一个例子,如下:
ClientThread
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
class ClientThread implements Runnable
{
Socket socket = null;
int id = 0;
public ClientThread(Socket socket, int id)
{
this.socket = socket;
this.id = id;
}
@Override
public void run()
{
OutputStream out = null;
InputStream in = null;
System.out.println("Begin to Chat to server...");
try
{
out = socket.getOutputStream();
in = socket.getInputStream();
// 循环发送与服务端不停的交互数据
while (true)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
doWrite(out);
System.out.println("begin read message from server.");
doRead(in);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
in.close();
out.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
*
* 读取服务端数据
*
* @param in
*
* @return
*/
public static boolean doRead(InputStream in)
{
// 引用关系,不要在此处关闭流
byte[] bytes = new byte[1024];
try
{
in.read(bytes);
System.out.println("line:" + new String(bytes).trim());
}
catch (IOException e)
{
e.printStackTrace();
}
return true;
}
/**
*
* 发送数据到服务端
*
* @param out
*
* @return
*/
public boolean doWrite(OutputStream out)
{
// 引用关系,不要在此处关闭流
String line = "Hello server, I am client = " + id + "\n";
line = line + "I want you to do something for me";
try
{
out.write(line.getBytes());
out.flush();
}
catch (IOException e)
{
e.printStackTrace();
}
return true;
}
}
ClientMain
import java.io.IOException;
import java.net.Socket;
public class ClientMain
{
public static void main(String[] args)
{
Socket socket = null;
System.out.println("ClientSocket Begin........");
try
{
for (int i = 0; i < 5; i++)
{
socket = new Socket("192.168.6.168", 8888);
new Thread(new ClientThread(socket, i), "ClientThread " + i).start();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
分享到:
相关推荐
Java 编写基于 CMPP3.0 的 Socket 服务端和客户端是移动通讯领域中常见的技术实践,主要用于实现与移动运营商的短信网关进行数据交互。CMPP(China Mobile Short Message Peer-to-Peer)是中国移动制定的一种短消息...
在这个"java socket服务端和客户端"的项目中,我们可以探讨以下几个关键知识点: 1. **Socket类和ServerSocket类**: - `Socket`类代表了网络上的一个连接,它用于建立客户端到服务器的连接,并进行数据传输。通过...
### Java Socket 长连接客户端和服务端实现 在Java中,使用Socket进行网络通信是一种非常常见的技术手段。本文将详细解读“Java Socket长连接客户端服务端(标准实例)”的相关知识点,包括其实现原理、代码解析及...
5. **关闭资源**:服务器端在完成与客户端的交互后,也需要关闭输入流、输出流和 Socket。 **测试与模拟器** 项目中的 "testProject" 可能包含了服务端的测试代码,而 "j2me与j2se聊天" 可能是客户端的 J2ME 代码...
在这个项目中,"基于Android的简单Socket服务端与客户端"实现了两个Android应用程序:一个作为服务端,另一个作为客户端,它们通过Socket进行数据交换。 首先,我们要理解Socket的工作原理。Socket是网络编程的基本...
本项目是一个自己编写的Java多线程Socket服务端,能够接收来自网络调试助手或其他客户端的数据。 首先,我们需要理解Java Socket的基本概念。Socket是网络上的两个进程间通信的端点,就像电话线两端的电话一样。在...
标题中的"Socket服务端和客户端代码"是指使用C#编写的服务端程序与客户端程序,它们通过Socket进行交互。 服务端通常负责监听特定IP地址和端口,等待客户端连接。描述中提到"一个服务端对应多个客户端",这是典型的...
本示例探讨了如何使用Adobe Flex作为客户端,通过Socket接口与Java实现的多线程Socket服务端进行通信。以下是对这个主题的详细解释: 首先,Flex是一种开放源代码的富互联网应用程序(RIA)开发框架,它允许开发者...
在"SOCKET服务端多线程处理客户端例子"中,核心在于如何有效地处理来自多个客户端的并发请求。传统的单线程模型在面对大量并发请求时,性能会显著下降,因为服务器需要依次处理每个请求,无法同时处理多个。为解决这...
### Java Socket 服务端与客户端编程详解 #### 一、网络编程中的主要问题及解决方案 在进行网络编程时,我们面临着两大核心问题:如何精确地定位网络中的主机以及如何高效可靠地进行数据传输。 1. **主机定位**:...
Java Socket服务端和客户端编程是Java软件开发中的一个重要部分,主要涉及网络通信和TCP/IP协议。网络编程的主要目标是定位网络主机并实现可靠的数据传输。TCP/IP协议族在这两方面都扮演了关键角色,其中IP层负责...
"C#多线程Socket开发" C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话。这里,我们将详细讲解如何使用C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话...
Java课程设计中的“客户端和服务端交互下载器”是一个典型的网络编程项目,它涉及到Java的核心概念和技术,包括网络通信、多线程以及文件操作等。在这个项目中,客户端和服务器通过TCP/IP协议进行通信,实现文件的...
本教程将深入探讨如何使用C语言实现TCP(Transmission Control Protocol)服务端与客户端的交互。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保数据的正确顺序传输和无损传输。 首先,我们来看`...
《SuperSocket服务端控制台与客户端WinForm案例详解》 在.NET开发领域,SuperSocket是一个功能强大且易于使用的开源套接字服务器框架,它为开发者提供了构建基于TCP/IP协议的应用程序的强大工具。本案例主要围绕...
在这个场景中,我们将讨论如何使用Socket实现服务器与客户端的交互,并结合链表数据结构来处理连接请求。链表作为一种动态数据结构,能有效地管理多个客户端连接,尤其是在服务器需要处理大量并发连接时。 首先,...
在本主题中,我们将深入探讨"socket服务端和客户端通讯"的核心概念、步骤以及关键知识点。 首先,Socket是Internet上的应用程序之间进行通信的一种机制,它提供了一种标准接口,使得应用层可以直接与传输层进行交互...
总结来说,"JAVA聊天服务端客户端"是一个涵盖Java网络编程、多线程、用户界面设计、数据传输安全等多个领域的项目。服务端和客户端通过Socket通信,处理并发连接,并确保数据的安全传输。了解这些知识点对于开发和...
**服务端**:服务端通常由Java的Servlet或Spring Boot等框架构建,它负责处理来自多个客户端的请求,例如购票、退票、查询票务信息等。服务端需要确保并发控制,因为多个网点可能同时尝试购买同一张票。这可能涉及...
- 可能还包括多线程或异步处理,以处理多个并发客户端 总的来说,C# Socket编程为我们提供了一种强大的工具来构建网络通信应用。无论是简单的聊天室还是复杂的分布式系统,理解如何创建和管理Socket,以及如何在...