`
dannyhz
  • 浏览: 397479 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

SocketServer 实现多客户端图片传输

阅读更多

程序实现的是一个读取照片(可改为其文件类型)的服务端,可同时接受多个客户端连接,并且同时接受多张图片的数据。主要是通过多线程控制,每次检测到有请求连接,则开辟一个新线程,新线程的作用是接受图片, 通过不同线程同时运行达到可同时接收多张图片。

1. 这是服务端的源代码:
import java.io.*;
import java.net.*;
public class LoadPicServer {
    public static void main(String[] args) throws IOException {
        int listen_port = 10005;      //监听的端口号
        long filecount = 1;      
        ServerSocket ss = new ServerSocket(listen_port);          //监听listen_port端口
        if(ss.isBound())
            System.out.println("The Server is listenning the port " + listen_port);
        while(true) {
            Socket s = ss.accept();   //检查是否有连接,该语句是阻塞语句,如果没有则会停在这。
            if(s.isConnected()) {    //如果有连接则返回true,执行下面语句
                String filename = new String("ServerPic" + filecount++ + ".jpg");
                System.out.println(s.getInetAddress().getHostAddress()
                                    + " is connected!");                //获取已连接的客户端的IP
                new Thread(new LoadPic(s,filename)).start();            //开启新线程接收图片,主线程继续回去while最开始检查有无连接。
            }
        }
    }
}
/*
 * 该类实现Runnable接口,用于实现多线程复制图片。
 * 该类的作用就是与主线程传入的Socket连接进行通信,从网络流获取对方的传送的文件数据。
 * */
class LoadPic implements Runnable {
    Socket s = null;
    String filename = null;
    BufferedInputStream bufin = null;
    BufferedOutputStream bufout = null;
    PrintWriter return_txt = null;
                                                                                                                                      
    public LoadPic(Socket s,String filename) {
        this.s = s;
        this.filename = filename;
    }
                                                                                                                                      
    public void run() { 
        try {
            bufin = new BufferedInputStream(s.getInputStream());                  //获取传入Socket的输入流,用于读取图片数据
            bufout = new BufferedOutputStream(new FileOutputStream(filename));    //在当前文件夹创建名为filename的文件,作为输出流的目的。
            return_txt = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true); //该流用来向客户端发送确认信息。
            byte[] bufdata = new byte[1024];
            int len;
            while((len = bufin.read(bufdata)) != -1) {              //从输入流读取数据,不为-1,即文件结束则继续读。
                bufout.write(bufdata,0,len);                         //往文件里写数据
                bufout.flush();
            }
                                                                                                                                              
            return_txt.println("服务器接收成功!");
                                                                                                                                              
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                s.close();
                bufin.close();
                bufout.close();
                return_txt.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}




2. 这是客户端源代码,可同时开启多个客户端,做图片并行传输测试。因为多个客户端代码基本一样,所以只需看下面代码即可:



import java.net.*;
import java.io.*;
//该类是客户端类,向服务器段发送请求连接,连接后就可以发送图片数据。
class UpPicClient {
    public static void main(String[] args) throws IOException,InterruptedException {
        Socket s = new Socket("192.168.1.7",10005);
        if(s.isBound()) {
            System.out.println("Connect successful!");
            BufferedInputStream bufin = new BufferedInputStream(new FileInputStream("1.jpg"));
            BufferedOutputStream bufout = new BufferedOutputStream(s.getOutputStream());
            BufferedInputStream confirm_txt = new BufferedInputStream(s.getInputStream());
            byte[] bufdata = new byte[1024];
            int len;
            while((len = bufin.read(bufdata)) != -1) {
                bufout.write(bufdata,0,len);
                bufout.flush();
            }
            s.shutdownOutput();
            System.out.println("发送结束!");
            len = confirm_txt.read(bufdata,0,bufdata.length);
            String str = new String(bufdata,0,len);
            System.out.println(str);
            s.close();
            bufin.close();
            bufout.close();
            confirm_txt.close();
        }
    }
}


分享到:
评论

相关推荐

    delphi SocketServer实现远程传输,双向传输

    在Delphi的SocketServer中,通过OnAccept事件处理程序,我们可以获取到新连接的客户端对象,然后通过这个客户端对象的SendData或Write方法向客户端发送数据,同时也可以通过ReceiveData或Read方法接收客户端的数据,...

    python SocketServer C++ 实现

    为了实现类似Python SocketServer的多线程或子进程处理请求的功能,我们可能需要结合使用C++的线程库(如std::thread)或进程库(如fork)。每个新连接可以创建一个新的线程或子进程来处理,这样可以并发地服务多个...

    c# WinForm 使用Socket实现简单实现服务端与客户端连接,实现消息发送,服务器客户端重连

    服务端(SocketServer)主要任务是监听特定的IP地址和端口,等待客户端的连接请求。当接收到连接请求时,服务端会创建一个新的Socket实例来处理这个连接,并可以设置一个回调函数来处理接收到的数据。在C#中,这通常...

    socketserver

    在本案例中,"socketserver FTP资源共享工具"可能是一个利用SocketServer模块实现的FTP服务器程序,用于在局域网或互联网上分享文件。 FTP(File Transfer Protocol)是一种标准的网络协议,设计用于在网络上进行...

    C++实现简单Socket编程,多客户端登陆以及检测客户端状态

    本教程将通过标题"“C++实现简单Socket编程,多客户端登陆以及检测客户端状态”"深入讲解如何使用C++进行Socket编程,包括多线程服务器的实现、TCP与UDP数据传输以及管理多个客户端连接。 首先,我们需要理解Socket...

    SocketServer

    - **ThreadingMixIn**:为服务器添加多线程支持,允许同时处理多个客户端连接。 - **ForkingMixIn**:实现多进程服务器,每个连接都会创建一个新的子进程来处理。 5. **自定义请求处理器**:SocketServer允许...

    Python TCPServer 多线程多客户端通信的实现

    总之,Python的`socket`和`socketserver`模块提供了强大的工具来实现多线程多客户端的TCP通信。通过创建自定义的请求处理器和利用多线程,我们可以构建能够高效处理大量并发连接的服务器。在实际应用中,还需要考虑...

    TCP IP通信编程实现(多客户端)

    本教程主要探讨的是如何使用TCP协议进行IP通信,并实现一个能够同时处理多个客户端连接的服务端程序。我们将围绕“多线程”和“SOCKET”这两个关键标签来深入讲解。 TCP(Transmission Control Protocol)是一种...

    WPF-Socket服务端对多个客户端_新

    在本文中,我们将深入探讨如何使用Windows Presentation Foundation (WPF) 实现Socket服务端来处理多个客户端的连接。标题中的“WPF-Socket服务端对多个客户端_新”表明这是一个更新过的版本,解决了之前版本的一些...

    socket实现客户端与服务器端通信

    本示例中的"socket实现客户端与服务器端通信"是一个简单的C#项目,它演示了如何使用Socket类在两者之间建立连接并进行数据传输,同时包含了异常退出的处理机制。这个项目包含两个部分:SocketServer和SocketClient,...

    python socket 实现服务器与客户端多线程连接

    在本文中,我们将深入探讨如何使用Python的socketserver模块实现服务器与多个客户端的多线程连接。 首先,我们需要理解socket和socketserver的概念。Socket是网络编程的基本接口,它提供了进程间通信(IPC)的能力...

    SuperSocket框架实现服务器和Winform客户端代码

    SuperSocket提供了一个基本的服务模型,包括SocketServer和SocketSession,用于处理客户端连接和数据传输。SocketServer作为服务器端的核心,负责监听端口、接受新连接并分配SocketSession处理客户端请求。...

    socket 实现客户端和服务端的双向通信

    在提供的文件列表中,"SocketServer"可能包含了服务端的代码实现,而"SocketClient"则包含了客户端的代码。通过分析这两个文件,你可以看到如何将上述理论应用到实际代码中。学习这些实例有助于深入理解Socket编程,...

    C#Socket利用单例来实现服务器与客户端交互

    本文将深入探讨如何利用C#的Socket类和单例设计模式来实现服务器与客户端的交互。 首先,让我们了解什么是Socket。Socket是网络通信的基本单元,可以看作是两个计算机之间进行数据传输的端点或连接。在TCP/IP协议栈...

    Android开发,Socket Client端和Socket Server端数据发送和接收

    在Java中,Socket类和ServerSocket类提供了客户端和服务端的实现。 - **TCP/IP协议**:传输控制协议/因特网协议,确保数据可靠传输,通过三次握手建立连接,四次挥手断开连接。 2. **创建Socket Server** - **...

    vb.net Socket服务端支持多客户端连接

    本教程将深入探讨如何创建一个Socket服务端,该服务端能够同时处理多个客户端连接,并能实时监控客户端的状态。 首先,我们需要了解Socket的基本概念。Socket是网络通信中的一个抽象层,它封装了底层的TCP/IP协议,...

    SocketServer_nightct1_socketserver_socketc#_

    总之,SocketServer_nightct1_socketserver_socketc#_是一个C#实现的TCP/IP网络通信客户端程序,通过Socket类实现了客户端与服务器之间的数据传输。理解Socket的工作原理和C#中的使用方法,是进行网络编程的基础。...

Global site tag (gtag.js) - Google Analytics