多个客户端与一个服务器端通信的问题

多个客户端与一个服务器端通信的问题

上篇博文主要是讲的关于客户端与服务器端的通信问题,在上篇博文中当我们只有一个客户端访问我们的服务器时是可以正常运行的,但是当我们有多个客户端访问我们的服务器时,我们的代码就不能正常工作了。

而在现实中,我们是很少有一个服务器只供一个客户端访问的,此篇博文就是来解决多个客户端访问我们服务器端的问题

解决方法:

  • 用一个多线程就可以解决

实现代码如下:

第一个:客户端的代码如下:

package org.wrh.socketserver;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class MyClient {

    public static void main(String[] args) throws Exception {
        //第一步:创建客户端Socket
        Socket s=new Socket("192.168.1.107",4567);
        //第二步:读取向服务器端发送的数据文件
        FileInputStream fis=new FileInputStream("d:\\100.txt");
        //第三步:获取Socket输出流
        OutputStream os=s.getOutputStream();

        byte[] buf=new byte[1024];
        int len;
        while((len=fis.read(buf))!=-1){
            os.write(buf, 0, len);

        }
        //刷新一下缓冲区的数据
        os.flush();
        //告诉服务器,我的数据已经发送完了
        s.shutdownOutput();

        //将服务器返回的数据读取出来
        InputStream is=s.getInputStream();
        byte[] buf_in=new byte[1024];
        int len_in=is.read(buf_in);
        System.out.println(new String(buf_in,0,len_in));

        fis.close();
        os.close();
        is.close();
        s.close();

    }

}

第二个:服务器端的代码如下

package org.wrh.socketserver;

import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {

    public static void main(String[] args) throws Exception {
        //第一步:建立服务器端Socket
        ServerSocket ss=new ServerSocket(4567);
        while(true){
            //第二步:获取客户端
            Socket socket=ss.accept();
            /*
             * 当我们考虑多个客户端访问服务器端的时候,我们就需要考虑多线程的问题
             * */
            new Thread(new TaskWork(socket)).start();
        }

    }

}

其中,线程类的代码如下

package org.wrh.socketserver;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TaskWork implements Runnable {
    Socket socket;
    public TaskWork(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        int count=0;
        /*
         * 获取客户端的ip地址
         * */
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");
        //第三步:获取Socket的输入流,对客户端发送来的数据进行读取
        try{
            InputStream is=socket.getInputStream();

            /*
             *读取数据,并 将数据写入到文件中
             * */
            File dir=new File("d:\\wu");
            if(!dir.exists()){
                dir.mkdirs();

            }

            File file=new File(dir,ip+".txt");
            /*
             * 如果在服务器端此文件已经存在的处理办法
             * */
            if(file.exists()){
                file=new File(dir,ip+"("+(++count)+").txt");
            }

            FileOutputStream fos=new FileOutputStream(file);

            byte[] buf=new byte[1024];
            int len=0;
            while((len=is.read(buf))!=-1){
                fos.write(buf, 0, len);

            }
            fos.flush();

            //给客户端一个反馈信息
            OutputStream os=socket.getOutputStream();
            os.write("收到数据".getBytes());

            //下面为关闭各种要关闭的资源
            fos.close();
            is.close();
            os.close();
            socket.close();

        }
        catch(Exception e){
            e.printStackTrace();
        }

    }

}

如果上篇博文的代码你弄懂了,这篇博文的代码理解起来就相当容易啦

说明

  • 上面的代码中,主线程一直在等待这客户端的连接,只要一有客户端连接进来,就会开启一个子线程来执行相应的操作。
时间: 2024-11-08 16:54:05

多个客户端与一个服务器端通信的问题的相关文章

一个客户端和一个服务器端聊天

*发送线程 import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class SendThread extends Thread { private Socket socket; public SendThread(Socket socket){ this.socket = socket; } @Override publi

socket 客户端和服务端通信

客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址,及应用程序所对应的端口号 TCP协议:安全稳定,一般不会发生数据丢失,但是效率低.利用TCP发生数据一般经过3次握手(所有效率低,自己百度三次握手) UDP协议:快速,效率高,但是不稳定,容易发生数据丢失(没有经过三次握手,不管服务器有空没空,信息全往服务器发,所有效率搞,但服务器忙的时候就没办法处

C#Socket_TCP(客户端,服务器端通信)

客户端与服务器通信,通过IP(识别主机)+端口号(识别应用程序). IP地址查询方式:Windows+R键,输入cmd,输入ipconfig. 端口号:可自行设定,但通常为4位. 服务器端: using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;

javascript客户端与服务器端通信

高性能的网络通信包括以下方面:选择正确的数据格式和与之匹配的传输技术. 一.数据格式 用于传输的数据格式有: 1)html,仅适用于特定场合,传输数据量大,不过它可以节省客户端的CPU周期, 2)XMl,相对笨重并且解析缓慢: 3)json 轻量级,解析速度快 4)字符分割的自定义格式十分轻量级,在解析大量数据集时快,不过需要编写额外的服务端构造程序,并在客户端解析.在创建自定义格式时,最重要的决定之一就是采用哪种分隔符,理想情况下,它应该是一个单字符,而且不应该存在于数据中,ASCII字符表的

浅析Java web程序之客户端和应用服务器端交互原理

最近一直在思考一个问题,为什么在用struts框架开发的时候FormBean都需要序列化,即实现java.io.Serializable接口,本着勤学好问的精神我Google了下对象序列化方面的文章,虽然大体了解了怎么做,但是还是没有搞清楚为什么要这样做:最后我想解决一个问题要找问题的根源和本质,于是从web程序客户端和服务器端交互的原理入手,终于找到了我要的答案. 1. 对象序列化是什么东东? 简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后

Android开发之简单的聊天室(客户端与服务器进行通信)

1.使用ServerSocket创建TCP服务器端 Java中能接收其他通信实体连接请求的类是ServerSocket, ServerSocket对象用于监听来 自客户端的Socket连接,如果没有连接,它将一直处于等待状态.ServerSocket包含一个监听来自客户端连接请求的方法. 1) Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞. 创建ServerSoc

[c#源码分享]客户端程序通过TCP通信传送"小文件"到服务器

源码  (不包含通信框架源码,通信框架源码请另行下载) 上一篇文章写了如何通过TCP通信发送图片到客户端,有朋友问如何传送文件,本文将就如何发送文件进行探讨. 对于比较小的文件,可以把文件转化成字节形式,用契约类包装一下,服务器收到后,再把字节转化成文件即可,这也是本文中实现的方式,这种方式的优点是比较简单灵活,缺点是不适合大文件的发送,也不能显示文件发送的进度. 基于TCP的通信机制,对于比较大的文件,这种方式是不可行的,大文件采用分段发送再合成的方式比较好,以后有时间再对如何发送大文件单独探

TCP协议的客户端与服务器的通信过程

使用TCP时,客户端与服务器端的通信流程 服务器初始化1)调用socket,创建文件描述符fd2) 调用bind将fd与服务器的IP与PORT绑定3)调用listen将套接字设为监听模式,准备接收客户端连接请求4)调用accept等待并接收客户端的连接请求,建立好TCP连接后,该函数会返回一个新的已连接套接字newfd 建立连接1)客户端调用socket创建文件描述符2)调用connect,向服务器发送连接请求3)connect会发送一个请求SYN段并阻塞等待服务器应答(第一次握手)4)服务器收

android 客户端支付宝 php服务器端编写

生成私钥 输入"genrsa -out rsa_private_key.pem 1024"命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原始的商户私钥(请妥善保 存该文件,PHP 开发语言中需要使用该文件), 生成公钥 输入"rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem"命令回车 后,在当前 bin 文件目录中会新增一个 rsa_p