服务器端:
Handler.java
package com.xmgd.socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import com.xmgd.socket.demo.Employee;
/**
* 服务器端的处理方法
*
* @author suj
*/
public class Handler implements Runnable {
private final Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
private ObjectInputStream getServerInputStream(Socket socket) throws IOException {
ObjectInputStream serverInputStream = new ObjectInputStream(socket.getInputStream());
return serverInputStream;
}
private ObjectOutputStream getServerOutputStream(Socket socket) throws IOException {
ObjectOutputStream serverOutputStream = new ObjectOutputStream(socket.getOutputStream());
return serverOutputStream;
}
@Override
public void run() {
ObjectInputStream serverInputStream;
ObjectOutputStream serverOutputStream;
try {
serverInputStream = getServerInputStream(socket);
serverOutputStream = getServerOutputStream(socket);
Employee employee = (Employee) serverInputStream.readObject();
System.out.println(employee.getEmployeeName());
System.out.println(employee.getEmployeeNumber());
List<String> rlist = employee.getList();
List<String> blist = new ArrayList<String>();
for (int i = 0; i < rlist.size(); i++) {
System.out.println(rlist.get(i));
blist.add(rlist.get(i) + "new");
}
employee.setEmployeeNumber(employee.getEmployeeNumber() + 0);
employee.setEmployeeName(employee.getEmployeeName() + "new");
employee.setList(blist);
serverOutputStream.writeObject(employee);
serverInputStream.close();
serverOutputStream.close();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
try {
if (socket != null)
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
Server.java
package com.xmgd.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 多线程socket传输对象的服务器端
*
* @author suj
*/
public class Server {
public static void main(String[] args) throws IOException {
new Server().service();
}
private final int port = 11111;
private final ServerSocket serverSocket;
private final ExecutorService executorService;// 线程池
private final int POOL_SIZE = 10;// 单个CPU线程池大小
public Server() throws IOException {
serverSocket = new ServerSocket(port);
// Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 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();
}
}
}
}
Employee.java
package com.xmgd.socket.demo;
import java.io.Serializable;
import java.util.List;
public class Employee implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int employeeNumber;
private String employeeName;
private List<String> list;
public Employee(int num, String name, List<String> list) {
employeeNumber = num;
employeeName = name;
list = list;
}
public String getEmployeeName() {
return employeeName;
}
public int getEmployeeNumber() {
return employeeNumber;
}
public List<String> getList() {
return list;
}
public void setEmployeeName(String name) {
employeeName = name;
}
public void setEmployeeNumber(int num) {
employeeNumber = num;
}
public void setList(List<String> list) {
this.list = list;
}
}
客户端:
Client.java
package com.xmgd.socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.xmgd.socket.demo.Employee;
/**
* 多线程传输对象的客户端
*
* @author suj
*/
public class Client {
public class ThreadTest extends Thread {
private int tmp;
public ThreadTest() {
}
public ThreadTest(int tmp) {
this.tmp = tmp;
}
public int getTmp() {
return tmp;
}
public synchronized void inputclass(Socket socket) throws IOException {
List<String> list = new ArrayList();
list.add("a" + tmp + "");
list.add("b" + tmp + "");
Employee joe = new Employee(150 + tmp, "Joe" + tmp + "", list);
joe.setList(list);
System.out.println("发送:employeeNumber= " + joe.getEmployeeNumber());
System.out.println("发送:employeeName= " + joe.getEmployeeName());
for (int i = 0; i < joe.getList().size(); i++)
System.out.println("发送:list" + i + "=" + joe.getList().get(i));
ObjectOutputStream clientOutputStream = new ObjectOutputStream(socket.getOutputStream());
clientOutputStream.writeObject(joe);
// clientOutputStream.close();
}
public synchronized void outclass(Socket socket) throws Exception {
ObjectInputStream clientInputStream = new ObjectInputStream(socket.getInputStream());
Employee joe = (Employee) clientInputStream.readObject();
System.out.println("接收:employeeNumber= " + joe.getEmployeeNumber());
System.out.println("接收:employeeName= " + joe.getEmployeeName());
for (int i = 0; i < joe.getList().size(); i++)
System.out.println("接收: list" + i + "= " + joe.getList().get(i));
}
@Override
public void run() {
try {
Socket socket = new Socket("127.0.0.1", 11111);
inputclass(socket);
outclass(socket);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void setTmp(int tmp) {
this.tmp = tmp;
}
}
public static void main(String[] arg) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
Client.ThreadTest threadDemo = new Client().new ThreadTest(i);
threadPool.execute(threadDemo);
}
}
}
分享到:
相关推荐
本文将深入探讨一种基于多线程Socket技术实现的文件传输方案,该方案支持断点续传、收发消息以及点对多点通信。我们将讨论如何使用VC++(Visual C++)环境来开发这样的系统,以及涉及的关键技术和概念。 首先,让...
在VC++环境中实现多线程Socket文件传输是一个涉及网络编程、多线程处理以及文件操作的重要技术主题。这里,我们将深入探讨如何利用C++和Socket API进行多线程的文件传输。 首先,让我们理解什么是Socket。Socket是...
在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...
"vcSocketfile.rar_VC文件传输_socket传输文件_socket文件传输_vc 多线程_多线程传输"这个压缩包文件提供了使用VC++(Visual C++)实现的多线程Socket文件传输的示例代码。下面我们将详细探讨这个主题中的关键知识点...
"C#多线程Socket开发" C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话。这里,我们将详细讲解如何使用C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话...
在Java编程领域,多线程Socket通信是一种常见且重要的网络编程技术。Socket是TCP/IP协议栈中的一个关键组件,用于在网络中实现进程间的通信。在这个名为"JAVA写的多线程socket通信程序源码"的项目中,我们可以看到...
在Windows环境下,Visual C++(简称VC)是一个常用的开发工具,它支持C++语言,可以用来实现多线程Socket文件传输。这个主题主要涵盖以下几个方面: 1. **Socket基础知识**:Socket是操作系统提供的接口,它允许...
标题中的"C# 多线程socket客户端"指的是在C#环境中,利用Socket类和多线程技术来创建一个能够并发处理多个连接的客户端应用。Socket是网络编程的基础,它提供了低级别的接口,允许应用程序进行TCP或UDP通信。多线程...
### Delphi多线程Socket编程介绍 随着分布式系统的广泛应用,多任务并发技术变得越来越重要。在当前基于多线程的操作系统环境下,开发并发多任务程序已成为软件开发领域的一个热点话题。Delphi作为一种强大的开发...
在VC++编程环境中,异步多线程Socket通信是一个关键的技术点,它涉及到网络编程、并发处理以及事件驱动模型等多个方面。在这个项目中,我们有服务端和客户端两部分,两者都利用了异步和多线程技术来提高通信效率和...
Socket通讯与多线程处理是计算机网络编程中的重要概念,主要应用于分布式系统、服务器开发以及实时数据传输等场景。在本实例中,我们将探讨如何利用Socket进行通信,并结合多线程技术来提升程序的并发处理能力。 ...
《VC_Socket_多线程文件传输》是一个基于C++实现的项目,它演示了如何在Windows环境下使用Visual Studio 2005进行多线程的文件上传与下载功能。这个项目的核心技术主要包括Socket编程、多线程处理以及文件操作,这些...
一旦连接建立,客户端就可以通过Socket对象的Send和Receive方法发送和接收数据。文件"IOTClient"很可能是客户端的源代码,包含连接服务器和进行数据交换的逻辑。 在多线程环境下,服务端可能会为每个客户端连接创建...
初学者可以通过阅读这些代码,了解如何在Qt中设置多线程服务器,如何使用QTcpSocket进行通信,以及如何处理连接和数据传输。 总的来说,这个项目是一个很好的起点,它涵盖了Qt网络编程和多线程的基本概念,对于想...
本项目“C#多线程socket聊天室A”就是一个很好的实例,它展示了如何利用C#的Socket类和多线程技术构建一个聊天服务器。 首先,让我们深入理解“Socket”。Socket是网络通信的基本单元,它是进程间通过网络进行通信...
本主题聚焦于C#中的多线程Socket通信,这是一个核心概念,它允许程序同时处理多个网络连接,提高效率并优化资源利用。在本文中,我们将深入探讨多线程与Socket通信的基本原理,以及如何在C#中实现这一技术。 一、...
通过这种方式,Java多线程Socket实现可以构建出高并发、实时交互的网络应用,如聊天室、文件传输等。然而,实际开发中还需要考虑异常处理、资源管理、网络延迟等因素,以确保系统的稳定性和可靠性。同时,为了提高...
在这个"多线程Socket程序源码"中,我们主要探讨的是如何利用Java的多线程技术和Socket API来构建一个支持多个客户端同时连接并进行聊天的系统。下面将详细解释相关知识点。 1. **Socket**:Socket是网络通信中的一...
.rar"则可能探讨了I/O完成端口(IOCP)技术,这是在Windows中实现高效率Socket服务器的一种方法,虽然不直接适用于Linux,但了解异步I/O和线程池的概念对于优化Linux下的多线程Socket服务器也很有帮助。 最后,"多...
通过创建Socket对象,开发者可以建立TCP或UDP连接,进行双向数据传输。在这个聊天工具中,Socket被用来在客户端和服务端之间建立可靠的连接,实现聊天信息的实时交换。 **客户端-服务器架构** 客户端-服务器模式是...