`
sj060402245
  • 浏览: 794 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

多线程socket对象传输

阅读更多
服务器端:

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);
  }
}

}


0
1
分享到:
评论

相关推荐

    多线程socket文件传输_支持断点续传_收发消息_点对多点

    本文将深入探讨一种基于多线程Socket技术实现的文件传输方案,该方案支持断点续传、收发消息以及点对多点通信。我们将讨论如何使用VC++(Visual C++)环境来开发这样的系统,以及涉及的关键技术和概念。 首先,让...

    VC++ 多线程socket文件传输

    在VC++环境中实现多线程Socket文件传输是一个涉及网络编程、多线程处理以及文件操作的重要技术主题。这里,我们将深入探讨如何利用C++和Socket API进行多线程的文件传输。 首先,让我们理解什么是Socket。Socket是...

    C++多线程SOCKET收发

    在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...

    vcSocketfile.rar_VC文件传输_socket传输文件_socket文件传输_vc 多线程_多线程传输

    "vcSocketfile.rar_VC文件传输_socket传输文件_socket文件传输_vc 多线程_多线程传输"这个压缩包文件提供了使用VC++(Visual C++)实现的多线程Socket文件传输的示例代码。下面我们将详细探讨这个主题中的关键知识点...

    c#多线程socket开发(一个服务器对多个客户端)

    "C#多线程Socket开发" C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话。这里,我们将详细讲解如何使用C#语言开发多线程Socket服务器端程序,实现一个服务器同时与多个客户端连接对话...

    JAVA写的多线程socket通信程序源码

    在Java编程领域,多线程Socket通信是一种常见且重要的网络编程技术。Socket是TCP/IP协议栈中的一个关键组件,用于在网络中实现进程间的通信。在这个名为"JAVA写的多线程socket通信程序源码"的项目中,我们可以看到...

    VC socket多线程文件传输

    在Windows环境下,Visual C++(简称VC)是一个常用的开发工具,它支持C++语言,可以用来实现多线程Socket文件传输。这个主题主要涵盖以下几个方面: 1. **Socket基础知识**:Socket是操作系统提供的接口,它允许...

    C# 多线程socket客户端

    标题中的"C# 多线程socket客户端"指的是在C#环境中,利用Socket类和多线程技术来创建一个能够并发处理多个连接的客户端应用。Socket是网络编程的基础,它提供了低级别的接口,允许应用程序进行TCP或UDP通信。多线程...

    delphi多线程socket编程介绍

    ### Delphi多线程Socket编程介绍 随着分布式系统的广泛应用,多任务并发技术变得越来越重要。在当前基于多线程的操作系统环境下,开发并发多任务程序已成为软件开发领域的一个热点话题。Delphi作为一种强大的开发...

    vc 异步多线程socket 包括服务端和客户端

    在VC++编程环境中,异步多线程Socket通信是一个关键的技术点,它涉及到网络编程、并发处理以及事件驱动模型等多个方面。在这个项目中,我们有服务端和客户端两部分,两者都利用了异步和多线程技术来提高通信效率和...

    Socket通讯与多线程处理-完整实例

    Socket通讯与多线程处理是计算机网络编程中的重要概念,主要应用于分布式系统、服务器开发以及实时数据传输等场景。在本实例中,我们将探讨如何利用Socket进行通信,并结合多线程技术来提升程序的并发处理能力。 ...

    VC_Socket_多线程文件传输

    《VC_Socket_多线程文件传输》是一个基于C++实现的项目,它演示了如何在Windows环境下使用Visual Studio 2005进行多线程的文件上传与下载功能。这个项目的核心技术主要包括Socket编程、多线程处理以及文件操作,这些...

    C#基于TCP的Socket多线程通信(包含服务端和客户端)

    一旦连接建立,客户端就可以通过Socket对象的Send和Receive方法发送和接收数据。文件"IOTClient"很可能是客户端的源代码,包含连接服务器和进行数据交换的逻辑。 在多线程环境下,服务端可能会为每个客户端连接创建...

    Qt Socket 多线程代码实现

    初学者可以通过阅读这些代码,了解如何在Qt中设置多线程服务器,如何使用QTcpSocket进行通信,以及如何处理连接和数据传输。 总的来说,这个项目是一个很好的起点,它涵盖了Qt网络编程和多线程的基本概念,对于想...

    C#多线程socket聊天室A

    本项目“C#多线程socket聊天室A”就是一个很好的实例,它展示了如何利用C#的Socket类和多线程技术构建一个聊天服务器。 首先,让我们深入理解“Socket”。Socket是网络通信的基本单元,它是进程间通过网络进行通信...

    c# 多线程SOCKET通信

    本主题聚焦于C#中的多线程Socket通信,这是一个核心概念,它允许程序同时处理多个网络连接,提高效率并优化资源利用。在本文中,我们将深入探讨多线程与Socket通信的基本原理,以及如何在C#中实现这一技术。 一、...

    java多线程Socket简单实现

    通过这种方式,Java多线程Socket实现可以构建出高并发、实时交互的网络应用,如聊天室、文件传输等。然而,实际开发中还需要考虑异常处理、资源管理、网络延迟等因素,以确保系统的稳定性和可靠性。同时,为了提高...

    多线程Socket程序源码

    在这个"多线程Socket程序源码"中,我们主要探讨的是如何利用Java的多线程技术和Socket API来构建一个支持多个客户端同时连接并进行聊天的系统。下面将详细解释相关知识点。 1. **Socket**:Socket是网络通信中的一...

    socket linux c++ 多线程3

    .rar"则可能探讨了I/O完成端口(IOCP)技术,这是在Windows中实现高效率Socket服务器的一种方法,虽然不直接适用于Linux,但了解异步I/O和线程池的概念对于优化Linux下的多线程Socket服务器也很有帮助。 最后,"多...

    C# 多线程 Socket 聊天

    通过创建Socket对象,开发者可以建立TCP或UDP连接,进行双向数据传输。在这个聊天工具中,Socket被用来在客户端和服务端之间建立可靠的连接,实现聊天信息的实时交换。 **客户端-服务器架构** 客户端-服务器模式是...

Global site tag (gtag.js) - Google Analytics