主要用到线程和线程池。没个客户端访问都要启动一个线程,然后将其存放在线程池中。这样就实现了多个用户的同时访问!
启动一个服务器,三个客户端,将其发送是信息分别为“send1”“send2”“send3”。运行结果为:
server控制台:send1
send2
send3
send1客户端:已收到信息为:send1
send2客户端:已收到信息为:send2
send3客户端:已收到信息为:send3
package testSocket_Thread;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
ServerSocket server; //其方法accept 用来监听客户端的链接
Socket socket;
static List<Socket> list = new ArrayList<Socket>();//保存链接的Socket对象
ExecutorService exec; //线程池类(说白了就是存放线程用的)
//1. Executors.newCachedThreadPool()缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中
//2. execute(Runnable r) 其实就是对Runnable对象调用start()方法
//3. exec.shutdownNow(); 一旦执行,线程将从线程池消失(客户端)
public Server(){
try {
server = new ServerSocket(22222);//启动监听,端口为22222
exec = Executors.newCachedThreadPool();
while(true) {
socket = server.accept();
list.add(socket);
exec.execute(new Tast(socket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
class Tast implements Runnable {
Socket socket; //服务器端Socket对象
DataInputStream in; //数据输入输出流
DataOutputStream ou;
public Tast(Socket socket) throws IOException{
this.socket = socket;
in = new DataInputStream(socket.getInputStream()); //获取Socket中的出入输出流,以完成通信
ou = new DataOutputStream(socket.getOutputStream());
}
public void run() {
try {
//---------- 这里可以换成任何数据包的接受和发送 ----------
String receive = in.readUTF(); //读取客户端信息
ou.writeUTF("已收到信息为:"+receive);//向客户端发送信息
//注意:读取和发送的顺序不能错
ou.close();
in.close();
socket.close();
System.out.println(receive);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server();
}
}
package testSocket_Thread;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Client {
static ExecutorService exec = Executors.newCachedThreadPool();
public Client() {
try {
Socket socket = new Socket("127.0.0.1", 22222);
exec.execute(new Sender(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
class Sender implements Runnable {
Socket socket; //客户端Socket对象
DataInputStream in; //输入输出流
DataOutputStream ou;
public Sender(Socket s){
socket = s;
}
public void run() {
try {
in = new DataInputStream(socket.getInputStream());//获取Socket中的出入输出流,以完成通信
ou = new DataOutputStream(socket.getOutputStream());
//---------- 这里可以换成任何数据包的接受和发送 ----------
ou.writeUTF("send2"); //向服务器端发送信息
String receive = in.readUTF(); //接受服务器的反馈信息
in.close();
ou.close();
socket.close();
//exec.shutdownNow(); 一旦执行,线程将从线程池消失
System.out.println(receive);
}catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client();
}
}
下一篇将是客户端与客户端交互信息。
分享到:
相关推荐
C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话。这里,我们将详细讲解如何使用C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话。 多线程Socket服务器...
在这个特定的场景中,我们讨论的是一个设计为连接多个服务器的Socket客户端。这个客户端程序能够向多个服务端发送消息,并且在消息中携带自身的ID,以便服务端识别消息来源。此外,它还具备了自动重连功能,即在非...
在标题"socket 一个服务器对应多个客户端使用多线程"中,提到的是使用Socket编程来设计一个服务器,该服务器能够同时处理来自多个客户端的连接请求,这通常被称为“一对一”或“一对多”模型。在Linux环境下,这种...
标题 "c++实现socket:一个服务器对应多个客户端相互传递信息" 指的是利用C++的socket API创建一个服务器程序,该服务器可以同时处理来自多个客户端的连接请求,并允许这些客户端之间交换数据。这种设计模式通常称为...
在客户端唯一需要知道的就是它归属的调度服务器的通信IP和端口,因此client是发送连接的主动方,由调度服务器监听是否有client请求建立连接,当建立连接成功后,把该连接信息存储到一个结合中以便监控client的存货...
在本文中,我们将深入探讨如何使用C#编程语言通过Socket实现一个简单的聊天系统,使得服务器可以与多个客户端进行通信。Socket在计算机网络编程中扮演着重要角色,它提供了进程间通信(IPC)的能力,允许不同计算机...
一个服务器端和多个客户端的Socket通信。启动服务端后,服务端通过持续监听客户端发来的请求,一旦监听到客户端传来的信息后,两端便可以互发信息了。服务器端需要绑定一个IP和端口号,用于客户端在网络中寻找并建立...
1.基于MFC通过多线程实现多个客户端同时连接服务器。 2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到...
实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了...
在本文中,我们将深入探讨如何...总之,构建一个能处理多个客户端的WPF Socket服务器需要正确地管理连接、数据传输和并发处理。通过优化代码和使用适当的库,可以显著提高服务端的性能和稳定性,以满足实时传输的需求。
学习Python网络通信的时候发现书上只有一个服务端对应一个客户端的情形,于是自己想自己动手实现一个服务端响应多个客户端。 首先建立服务器的socket来监听客户端的请求: tcpSerSock=socket(AF_INET,SOCK_STREAM) ...
5. **多线程处理**:在实际应用中,服务器可能需要同时处理多个客户端的连接。因此,服务器通常会为每个新连接创建一个新线程或使用I/O完成端口(IOCP)来并发处理。 6. **控制台程序**:在这个案例中,程序运行于...
本项目名为"socket 单服务器/多客户端",显然关注的是如何构建一个能够处理多个客户端连接的单一服务器系统,并且修复了客户端退出时服务器崩溃的错误,以及优化了资源释放的顺序。 首先,我们要理解Socket的基本...
本教程主要聚焦于如何利用Socket编程技术实现服务器向客户端传输多个文件。在讲解之前,我们先了解一下Socket的基本概念。 Socket,又称为套接字,是网络通信的一种接口,它允许两个或更多的进程在Internet上进行...
在压缩包中的"MultiSocketEx"可能包含了一个多客户端-服务器示例,这可能涉及到并发处理多个客户端连接。在这种情况下,服务器通常会启动一个线程或异步操作来处理每个新的客户端连接,以便同时处理多个连接。 学习...
Java的`java.nio`包提供了非阻塞I/O的支持,可以同时处理多个客户端连接,提高了服务器的并发能力。 总结起来,基于TCP的Socket编程是构建网络应用的基础,涉及网络连接的建立、数据的可靠传输和通信链路的维护。...
这样,服务器可以同时处理多个客户端请求,而不会阻塞其他连接。 8. **错误处理和异常机制**:一个完善的Socket库应该包含了丰富的错误处理和异常机制,能够捕获并处理网络通信过程中可能出现的各种问题,如连接...
链表作为一种动态数据结构,能有效地管理多个客户端连接,尤其是在服务器需要处理大量并发连接时。 首先,我们需要理解Socket的基本概念。Socket是操作系统提供的接口,它允许程序创建、管理和关闭网络连接。在...
如果服务器需要同时处理多个客户端的连接,可以为每个连接创建一个新的线程,这样可以实现并发处理。 总结,Socket技术是实现客户端与服务器端通信的基础,通过创建Socket实例、建立连接、交换数据以及关闭连接等...