java socket 客户端(java socket 多个客户端连接, 怎分辨是那一位客户端)

:暂无数据 2026-04-06 00:40:01 0
想知道那些精通java socket 客户端的人,是如何看待java socket 多个客户端连接, 怎分辨是那一位客户端的吗?本篇将为你揭秘他们的思考路径。

本文目录

java socket 多个客户端连接, 怎分辨是那一位客户端

使用IP区分
你可以这样:ServletSocket.accept();获取到的Socket对象
使用Map存起来,IP做Key
Map(Ip,Socket);
这样就可以了

用Java 的socket实现客户端的功能

//服务端程序:
import java.io.*;
import java.net.*;
 
public class TCPServer {
    public static void main(String args) throws IOException {
        new TCPServer().init();
    }
    @SuppressWarnings("static-access")
    private void init() throws IOException{
        @SuppressWarnings("resource")
        ServerSocket server = new ServerSocket(1000);
        Socket client = null;
        while(true){
            try {
                client = server.accept();
                BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
                byte;
                int len = 0;
                String message = "";
                while((len=bis.read(b))!=-1){
                    message = new String(b,0,len);
                    System.out.print("客户端:"+client.getInetAddress().getLocalHost().getHostAddress()+"发来消息:" + message);
                    if("byte".equals(message.trim()))
                        client.close();
                    PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
                    pw.println(message);
                }
            } catch (Exception e) {
                System.err.println("客户端:"+client.getInetAddress().getLocalHost().getHostAddress()+" 已断开连接!");
            }
        }
    }
}

//客户端程序:
import java.io.*;
import java.net.Socket;
 
public class TCPClient implements Runnable{
    public static void main(String args) throws IOException {
        new TCPClient().init();
    }
    private void init() throws IOException{
        @SuppressWarnings("resource")
        final Socket client = new Socket("127.0.0.1",1000);
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String send = "";
        while(true){
            send = in.readLine();
            PrintWriter out = new PrintWriter(client.getOutputStream(),true);
            if(!"byte".equals(send.trim()))
                out.println(send);
            else{
                out.println(send);
                System.exit(0);
            }
            new Thread(new TCPClient(){
                @SuppressWarnings("static-access")
                public void run(){
                    try {
                        BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
                        byte;
                        int len = 0;
                        while((len=bis.read(b))!=-1){
                            System.out.println("服务器:" +client.getInetAddress().getLocalHost().getHostAddress()+"发来消息:"+new String(b,0,len).trim());
                        }
                    } catch (IOException e) {
                        System.err.println("连接服务器失败!");
                    }
                }
            }).start();
        }
    }
    public void run() {}
}

//服务器测试结果:

客户端:192.168.0.200发来消息:001 byte

客户端:192.168.0.200发来消息:byte

客户端:192.168.0.200 已断开连接!

客户端:192.168.0.200发来消息:adasd

客户端:192.168.0.200 已断开连接!

//客户端测试结果:

---001号客户端--

001 byte

服务器:192.168.0.200发来消息:001 byte

byte //001礼貌说跟服务器说byte

---002号客户端--

adasd //002客户端直接关闭程序

服务器:192.168.0.200发来消息:adasd

java socket编程,客户端发送文件给服务器,服务器接收到文件后如何返回确认信息告诉客户端文件已接收

import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
  
/** 
 *  
 * 文件名:ServerReceive.java 
 * 实现功能:作为服务器接收客户端发送的文件 
 *  
 * 具体实现过程: 
 * 1、建立SocketServer,等待客户端的连接 
 * 2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据 
 *      其中保存客户端要发送的文件名和文件大小信息 
 * 3、根据文件名在本地创建文件,并建立好流通信 
 * 4、循环接收数据包,将数据包写入文件 
 * 5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件 
 * 6、文件接收工作结束 
 *  
 *  
 * 【注:此代码仅为演示客户端与服务器传送文件使用, 
 *      每一个数据包之前没有文件协议命令 
 *      具体的协议传输和文件传出的使用阶段可根据自己程序自行放置】 
 *  
 *  
 * 作者:小菜鸟 
 * 创建时间:2014-08-19 
 *  
 * */  
  
  
  
  
public class ServerReceive {  
  
    public static void main(String args) {  
          
        /**与服务器建立连接的通信句柄*/  
        ServerSocket ss = null;  
        Socket s = null;  
          
        /**定义用于在接收后在本地创建的文件对象和文件输出流对象*/  
        File file = null;  
        FileOutputStream fos = null;  
          
        /**定义输入流,使用socket的inputStream对数据包进行输入*/  
        InputStream is = null;  
          
        /**定义byte数组来作为数据包的存储数据包*/  
        byte;  
          
        /**用来接收文件发送请求的字符串*/  
        String comm = null;  
          
          
        /**建立socekt通信,等待服务器进行连接*/  
        try {  
            ss = new ServerSocket(4004);  
            s = ss.accept();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
          
          
        /**读取一行客户端发送过来的约定信息*/  
        try {  
            InputStreamReader isr = new InputStreamReader(s.getInputStream());  
            BufferedReader br = new BufferedReader(isr);  
            comm = br.readLine();  
        } catch (IOException e) {  
            System.out.println("服务器与客户端断开连接");  
        }  
          
        /**开始解析客户端发送过来的请求命令*/  
        int index = comm.indexOf("/#");  
          
        /**判断协议是否为发送文件的协议*/  
        String xieyi = comm.substring(0, index);  
        if(!xieyi.equals("111")){  
            System.out.println("服务器收到的协议码不正确");  
            return;  
        }  
          
        /**解析出文件的名字和大小*/  
        comm = comm.substring(index + 2);  
        index = comm.indexOf("/#");  
        String filename = comm.substring(0, index).trim();  
        String filesize = comm.substring(index + 2).trim();  
          
          
        /**创建空文件,用来进行接收文件*/  
        file = new File(filename);  
        if(!file.exists()){  
            try {  
                file.createNewFile();  
            } catch (IOException e) {  
                System.out.println("服务器端创建文件失败");  
            }  
        }else{  
            /**在此也可以询问是否覆盖*/  
            System.out.println("本路径已存在相同文件,进行覆盖");  
        }  
          
        /**【以上就是客户端代码中写到的服务器的准备部分】*/  
          
          
        /** 
         * 服务器接收文件的关键代码*/  
        try {  
            /**将文件包装到文件输出流对象中*/  
            fos = new FileOutputStream(file);  
            long file_size = Long.parseLong(filesize);  
            is = s.getInputStream();  
            /**size为每次接收数据包的长度*/  
            int size = 0;  
            /**count用来记录已接收到文件的长度*/  
            long count = 0;  
              
            /**使用while循环接收数据包*/  
            while(count 《 file_size){  
                /**从输入流中读取一个数据包*/  
                size = is.read(buffer);  
                  
                /**将刚刚读取的数据包写到本地文件中去*/  
                fos.write(buffer, 0, size);  
                fos.flush();  
                  
                /**将已接收到文件的长度+size*/  
                count += size;  
                System.out.println("服务器端接收到数据包,大小为" + size);  
            }  
              
        } catch (FileNotFoundException e) {  
            System.out.println("服务器写文件失败");  
        } catch (IOException e) {  
            System.out.println("服务器:客户端断开连接");  
        }finally{  
            /** 
             * 将打开的文件关闭 
             * 如有需要,也可以在此关闭socket连接 
             * */  
            try {  
                if(fos != null)  
                    fos.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }//catch (IOException e)  
        }//finally  
  
    }//public static void main(String args)  
}//public class ServerReceive

如何解决大量J**A客户端Socket关闭时TIME

TIME_WAIT这个状态是TCP/IP设计时为考虑网络的可靠性所必须的,主动发起关闭连接的一方在接收到被动关闭连接方发出的FIN后就会进入TIME_WAIT状态,这个状态最长会持续2*MSL(Max Segment Life)时间,其作用是(1)主动方发出的ACK可能会在网络中丢失,如果丢失被动方会重新发出FIN,如果提前关闭了连接就无法接收到重发的FIN。(2)使游荡在网络中的分组在经过2*MSL超时后消失。
TIME_WAIT这个设计是为了网络可靠性的考虑,具体设定时间长短需要根据网络情况决定,超时时间Windows默认设置一般为四分钟,也就是说主动方打开的端口最长在四分钟内不会被释放,导致可用端口减少。
TIME_WAIT的默认等待时间操作系统设置一般都较为保守,如果网络连接中出现大量TIME_WAIT状态,可以考虑修改设置(1)修改操作系统配置减少TIME_WAIT时间,Windows上的设置方法是进入注册表的HKLM-》SYSTEM-》CurrentControlSet-》services-》TcpIp-》Parameters,添加一个DWORD项“TcpTimedWaitDelay”,时间可设置的短一些(比如60秒或30秒)(2)使用Socket提供的SO_LINGER选项,当SoLinger设置为0时Socket会取消关闭连接等待(不建议)。

java socket 客户端是如何向服务器端发送消息的

服务器端和客户端都是通过SOCKET来进行通信的,首先产生一个 socket实例,通过这个实例,服务器端调用accept这个方法接收来自客户端发送的信息.但是在产生socket实例的时候必须初始化一个端口.用来负责接受客户端的请求!
客户端要给服务器发送消息也必须产生一个socket实例,初始化的时候必须指定服务器的IP地址,并且指定服务接收的端口号,这样客户端才能找到服务器要接收的地方,找到地方就可以发送过去了。和你写信一样。找到地址
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter out = new PrintWriter(socket.getOutputStream());

BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
这个只是用来获取一个从键盘的一个流.传送给服务器端的数据都是通过流来表示的。意思是是键盘输入的一个字节转化成字符流.并输出或者写入!

java中的socket客户端的端口如何绑定

java中的socket客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象就可以了,客户端的代码可以看下实例:
Socket socket = new Socket("168.160.12.42",9998);
或:
Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主机名为InetAddress.getLocalHost()的服务器申请连接
客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为168.160.12.42的主机上、端口为9998的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。

本文关于java socket 客户端的“知”的部分(java socket 多个客户端连接, 怎分辨是那一位客户端)已完结。下期,我们将聚焦于“行”,聊聊如何具体应用。
本文编辑:admin

更多文章:


oracle去重查询(oracle去重复求和)

oracle去重查询(oracle去重复求和)

本文旨在解决您关于oracle去重查询的两大困惑:一是理清基本概念,二是深入解析oracle去重复求和。内容干练,直奔主题。

2026年4月6日 02:00

getcwd(python 中os.pardir什么意思)

getcwd(python 中os.pardir什么意思)

大家好,getcwd相信很多的网友都不是很明白,包括python 中os.pardir什么意思也是一样,不过没有关系,接下来就来为大家分享关于getcwd和python 中os.pardir什么意思的一些知识点,大家可以关注收藏,免得下次来

2026年4月6日 01:40

structured time是什么意思(什么是setup time和hold time)

structured time是什么意思(什么是setup time和hold time)

你是否好奇,为什么人人都在谈structured time是什么意思?它和什么是setup time和hold time之间究竟存在着怎样微妙的联系?答案就在下文。

2026年4月6日 01:20

js输出html代码(js输出html在页面怎样显示换行)

js输出html代码(js输出html在页面怎样显示换行)

您是否曾想过,js输出html代码究竟是怎么一回事?它与js输出html在页面怎样显示换行之间又有什么联系?本文将为您一探究竟。

2026年4月6日 01:00

java socket 客户端(java socket 多个客户端连接, 怎分辨是那一位客户端)

java socket 客户端(java socket 多个客户端连接, 怎分辨是那一位客户端)

想知道那些精通java socket 客户端的人,是如何看待java socket 多个客户端连接, 怎分辨是那一位客户端的吗?本篇将为你揭秘他们的思考路径。

2026年4月6日 00:40

mysql和sql语法有区别嘛(mysql的语句和sql语句是一样的吗)

mysql和sql语法有区别嘛(mysql的语句和sql语句是一样的吗)

为什么说不懂mysql的语句和sql语句是一样的吗,就等于没学明白mysql和sql语法有区别嘛?这篇文章将给你一个令人信服的解释。

2026年4月6日 00:20

requests库下载及安装(win10怎么安装requests库)

requests库下载及安装(win10怎么安装requests库)

各位朋友,关于requests库下载及安装的讨论一直很多,今天咱们不聊复杂的,就聚焦于win10怎么安装requests库,用最直白的方式把它讲清楚。

2026年4月6日 00:00

向量的运算的所有公式cos(向量的运算的所有公式)

向量的运算的所有公式cos(向量的运算的所有公式)

老铁们,关于向量的运算的所有公式cos,你可能听过不少说法。今天,咱们就坐下来好好聊聊向量的运算的所有公式,保证让你豁然开朗。

2026年4月5日 23:40

随机生成正负1函数(excel随机函数,生成-1到1之间,不为0的保留两位位小数)

随机生成正负1函数(excel随机函数,生成-1到1之间,不为0的保留两位位小数)

嗨,正在屏幕前搜索随机生成正负1函数的你,是否也被excel随机函数,生成-1到1之间,不为0的保留两位位小数的问题困扰过?今天这篇内容就是为你准备的。

2026年4月5日 23:20

for循环改为while循环(while与for的转换)

for循环改为while循环(while与for的转换)

前几天,一位朋友问我:for循环改为while循环到底该怎么学?我只回了他三个字:抓住while与for的转换。今天就来详细说说为什么。

2026年4月5日 23:00

最近更新

oracle去重查询(oracle去重复求和)
2026-04-06 02:00:02 浏览:0
getcwd(python 中os.pardir什么意思)
2026-04-06 01:40:02 浏览:0
structured time是什么意思(什么是setup time和hold time)
2026-04-06 01:20:02 浏览:0
java socket 客户端(java socket 多个客户端连接, 怎分辨是那一位客户端)
2026-04-06 00:40:01 浏览:0
热门文章

繁体字转换器(繁体字转化)
2026-04-04 18:00:01 浏览:0
androidbc(bc8-android是什么手机型号)
2026-04-05 07:20:02 浏览:0
标签列表