使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求

初学java,目前写了一个服务端和一个客户端。大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信。也仅仅是是接受和返回简单的字符串。部分代码如下

public void run(){

    try{
        serverSocket=new ServerSocket(SERVER_PORT_ONE);
        System.out.println("serversocket已创建");
        while(true){

            clientSocket=serverSocket.accept();
            System.out.println("监测到了socket");

            receiveThread=new SocketThread(clientSocket);   //开启新线程处理请求

            receiveThread.start();
        }

    }catch(IOException e){
        System.out.println(e.getMessage());
    }
}

这是socket监听的代码。当服务器监听到了socket之后,开启一个新线程去处理。

socketthread类的run()方法来接受数据
public void run(){
String Command=null;
String str=null;

       output.println("服务器已经接受你的连接\n");

       while(true){
       try{ 
           str=null;
           str=input.readLine(); 
           System.out.println("监测数据如下:"+str);
           }catch(IOException e){ 
           System.out.println(e.getMessage());
           } 

       Command=str.trim().toUpperCase();
       if(str==null || Command.equals("QUIT")) {
           break;
       }
       }
       try{ 
           clientSocket.close();//关闭套接字 
           System.out.println("clientSocket已经断开连接");
           }catch(IOException e){ 
           System.out.println(e.getMessage()); 
           } 
           Command=null;
 }
 在while循环里面,服务端会不断读取来自客户端的内容,然后输出来。如果读到quit,就表示断开连接,并关闭socket。

现在的问题就是, 如果我的客户端的请求十分多样,比如发送语音,视频,图片或者数据给服务器进行处理,我的服务端必须做出相应的处理,请问如何做到这点啊。

我自己想的思路是客户端发送数据前先要发送一个header标签,表示想干什么。然后读取到了之后客户端再判断,然后分给不同的函数去处理。不知道这样好不好,如下所示。
while(true){
try{
str=null;
str=input.readLine();
if(str.equals("图片")){
图片相关函数(socket );
}

            if(str.equals("视频")){
                视频处理相关函数(socket );
                }

                    if(str.equals("数据")){
                数据处理相关函数(socket );//如各种算法
                }

           System.out.println("监测数据如下:"+str);
           }catch(IOException e){ 
           System.out.println(e.getMessage());
           } 

       Command=str.trim().toUpperCase();
       if(str==null || Command.equals("QUIT")) {
           break;
       }

不知道是否可行。

第二个问题,我的服务器要主动推送数据给客户端该如何实现,肯定不能写在这个线程里面。写在其他地方我的类和函数如何得到这个线程里的socket呢。

3个回答

这就是通信双方事先约定好通信规则,也就是所谓的协议的作用了。
各种通信业务,都是先定义好通信协议,然后才是通信操作处理了。

wojiushiwo945you
毕小宝 回复cyf799232707: 第一个问题,你的想法就已经是在规范协议了,可以按这个思路进行。第二个问题,服务器主动推送给客户端,那么就需要客户端也能处理收到的请求。
4 年多之前 回复
wojiushiwo945you
毕小宝 回复cyf799232707: 自己的项目开发中,通常是根据你们的业务规则自己约定好的。
4 年多之前 回复
cyf799232707
小豆子0722 请问这个协议要自己定义吗,还是有已经定义好的协议可以用。
4 年多之前 回复

自己定义相关的字段,服务器根据协议判断。

cyf799232707
小豆子0722 谢谢
4 年多之前 回复

我最近也在研究socket,针对你的第二个问题,我有个想法,我们一起探讨下:
新建一个成员变量buffer,把要传输给客户端的数据放在这里面,下次客户端连接的时候发送给客户端

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java Socket通信 客户端与服务器端的连接 和信息传输
一.建立客户端和服务器端的连接。 方法分2步: 1.在客户端创建Socket对象,用来发送连接请求 2.在服务器端穿件ServerSocket对象,用来接收请求。 //客户端 public class socket1 { Socket socket; public static void main(String[] args) { new socket1().setUpIn
准多线程TCP服务器,处理客户端连接请求。
上TCP服务器课的时候,老师讲了关于服务器设计的思想:
Java中多客户端同时连接服务端
Java中多客户端同时连接服务端 第一步 充分理解Socket 1.什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立
socket编程:客户端与服务器间的连接以及各函数的用法
在认真的看UNP之前,一直被socket编程说的云里雾里,今天我要让大家从整天上认识socket编程,让我们知道socket编程的整个流程和各个函数的用法。这样:我们在写一些简单的socket编程时就不用被那么多函数和调用顺序所迷惑了。下面看UNP书上给的图片描述的建立连接的过程,看了之后一目了然!     1.建立连接的概括图     2.各个函数的用法:       (1).sock
网络编程二(套接字Socket、客户端和服务端通信问题)
在客户机/服务器工作模式中,在Server端,要准备接受多个Client端计算机的通信。为此,除用IP地址标识Internet上的计算机之外,另还引入端口号,用端口号标识正在Server端后台服务的线程。端口号与IP地址的组合称为网络套接字(socket)。 Java语言在实现C/S模式中,套接字分为两类: 在Server端,ServerSocket类支持底层的网络通信; 在Clie
JAVA Socket服务器 判断客户端连接断开
备忘: sendUrgentDatapublic void sendUrgentData(int data) throws IOException在套接字上发送一个紧急数据字节。要发送的字节是数据参数的八个最低位。紧急字节在对套接字 OutputStream 的所有预先写入之后但在任何以后写入之前发送。  参数:data - 要发送的数据字节 抛出:IOException - 如果发送数据时发生错误。例如: try{             ServerSocke
Socket简介及客户端服务器连接实例
Socket简介及客户端服务器连接实例
Socket 编程经验谈---如何处理socket连接后服务器端或客户端的断开
现象:服务器端等待客户断连接,当socket连接建立后,如果客户端异常断开,服务器会抛出异常,从而导致程序运行中断 目标:希望服务器一直等待连接,客户端中断后程序不退出,而客户端重新恢复后可以继续保持连接 代码: public class Receive { public static byte[] buffer= new byte[1024]; public static Man
客户端与服务器新建套接字连接的一种方法
客户端与服务器新建套接字连接的一种方法 背景   最近在做一个C/S文件管理系统,想要把客户端命令跟文件的传输分开进行,这就要求我们重新在客户端与服务器之间建立一个新的套接字连接。问题   首先我们知道C/S服务器每接到一个客户的链接请求后,都将建立一个新的线程用于为客户服务,在高并发的情况下,服务器可能会同时开启相当多的线程,在这些服务线程中,如果有相当一部分客户要求进行文件传输,那我们就
套接字的(客户端与服务器端的连接)
Client.java文件: import java.io.*; import java.net.*; public class Client { public static void main(String args[]) { String [] mess = {"1+1在什么情况下不等于2", "狗为什么不生跳蚤","什么东西能看、能吃、能坐"};//用String类定义了一个字符串对
JAVA SOCKET网络编程,服务端接收多个客户端连接的实现
这是基于前面一篇文章的一个简单扩展,当然这不是最好的实现 服务端如果要想接收多个客户端连接,必须
服务器关了已经连接的客户端socket_fd,客户端做出的反应过程
服务器关了已经连接的客户端socket_fd,客户端做出的反应过程 (2008-07-21 10:27)    服务端关闭已连接客户端,客户端接着发数据产生问题,    1. 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写
服务端和客户端连接的两种方式,socket和DatagramSocket
socket有两种方式, 一种是Serversocket(服务端)和socket(客户端)的方式(基于tcp/ip的通信方式) 另一种是DatagramSocket(客户端和服务端)的方式(基于udp的通信方式) 第一种服务端需要绑定端口和ip,客户端监听服务端时需要知道服务端的端口和ip(可以不用绑定客户端的端口和ip,系统会自动分配端口给客户端),这种方式适合传输大型文件(几个G的游戏文
ServerSocket套接字实现服务器端和Socket套接字实现客户端
编写服务器端程序: 1.创建一个服务器套接字(ServerSocket),绑定到指定端口; 2.调用accep方法,侦听来自客户端的请求,如果客户发出的请求,则接受连接,返回通信套接字Socket; 3.调用Socket的getInputStream和getOutputStream方法,获得输入/输出流,开始网络数据的接收和发送; 4.关闭通信套接字,关闭服务器套接字;示例代码如下:pack
C# TCP客户端和服务端编程
服务器端的步骤如下。 (1)建立服务器端的Socket,开始侦听整个网络中的连接请求。 (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。 (3)当完成通信后,服务器关闭与客户端的Socket连接。 客户端的步骤如下。 (1)建立客户端的Socket,确定要连接的服务器的主机名和端口。 (2)发送连接请求到服务器,并等待服务器的回馈信息。 (3)连接成功后,与服务器进行数据的交互。 (4)数据处理完毕后,关闭自身的Socket连接。
服务器关了已经连接的客户端socket…
服务端关闭已连接客户端,客户端接着发数据产生问题,    1. 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。     根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client
socket实现多个客户端连接在一个服务器上
1、使用socekt通信一般步骤     1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。     2)客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。     3)服务器端:accept()
Java 利用 Socket 实现服务器客户端聊天
Socket是网络编程中最基本的通信接口,常用的网络辅助类,比如URL等之类,其底层还是基于Socket来实现的。 而Socket,形象来说,就是连接通信的两端,比如这样 S<==>S,中间的通道就是网络了,而简单地利用Socket,我们就可以来实现一个简单的聊天功能。 1. Server 端主要是利用ServerSocket的accept方法来等待客户端的连接,如果客户一直没有连接,则会在这里等待,直到客户端请求到来。 而客户端就是一个Socket,当客户端请求到来的时候,accept会返回一个Socke
Java Socket服务器端与客户端的编程步骤总结
一,InetAddress类: InetAddress类没有构造方法,所以不能直接new出一个对象; 可以通过InetAddress类的静态方法获得InetAddress的对象; InetAddress.getLocalHost(); InetAddress.getByName(""); 类主要方法: String - address.getHostName(); String -
多线程实现服务器与多个客户端通信
鉴于ServerSocket的accept方法是阻塞的,那么只能通过多线程的方式实现多客户端连接与服务器连接 基本步骤: 1,服务端创建ServerSocket绑定端口号,循环调用accept()方法 2,客户端创建一个socket并请求和服务器端连接 3,服务器端接受客户端请求,创建socket与该客户建立连接 4,两个socket在一个单独的线程上通话 5,服务器端继续等待新的
Android 使用Socket实现服务器与手机客户端的长连接八
一、发送请求的信息:1、接口 public interface Request { String getData(); }2、文本请求:public class TextRequest implements Request{ private Map<String, String> map = new HashMap<String, String>(); public Text
Socket与http、tcp客户端与服务器连接的区别!
1、TCP连接  要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。  建立起一个TCP连接需要经过“三次握手”:  第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待
客户端与服务端Socket通信原理详解
socket客户端与服务端通信原理详解
Socket服务端接受多个客户端的连接(.NET)
  本文模拟一个判断数据是否大于100的服务器端接受多个客户端的连接,为多个客户端提供服务的演示。 服务器端:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading; using System.Net.Sockets; namespace Net.Dale.TcpServerTest {
Python处理多个客户端连接---多路复用选择服务器
多路复用 到目前为止,我们已经看到如何用分支进程和派生线程来同时处理多个客户端,以及一个封装了这两个方案的库类。在这两种方法下,所有的客户端处理程序似乎都是彼此并行运行(即在同一时间内)运行的,所以在接受新的请求或处理长期运行的客户端处理程序时,服务器未被阻塞。 不过从技术上讲,线程和进程并不是真正并行运行的,除非你足够幸运,机器有多个cpu。相反,你的操作系统可以执行一个变戏法的操作—它在所
java socket实现的客户端和服务器端,服务器采用多线程实现,为每个客户分配一个线程
1:EchoServer类import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; im
Socket 客户端-服务器(C-S)通信实验
学习计算机网络编程也有一段时间了,对这段时间学习的东西做一个小总结吧,主要是基于socket,实现客户端和服务器的通信,编程用java语言。具体的实验要求如下: 设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。 服务端程序能响应单个或任意多个客户端连接请求;服务端能向单个客
使用Socket,让连接客户端可以对服务端执行相应的指令
我们都知道使用Socket套接字,可以让客户端来连接服务端,并提供相应的服务。那现在不仅如此,这里我们让连接的客户端能够在服务端执行相应的指令,并返回相应的执行结果 http://blog.csdn.net/franky_jie/article/details/54987285 http://blog.csdn.n
ServerSocket和Socket建立通信(客户端发送消息服务器接收并返回到客户端接收输出)
需求:客户端发送消息到服务器,服务器接收到消息并读取输出,然后写出到客户端客户端接收到输出。 1、建立服务器端      |-服务器建立通信ServerSocket      |-服务器建立Socket接收客户端连接      |-建立IO输入流读取客户端发送的数据      |-建立IO输出流向客户端发送数据消息 2、建立客户端      |-创建Socket通信,设置通信服务器的
TCP服务器如何区分不同的用户
CS架构:使用SOCKET(一般是一个整数),当服务器侦听到连接请求的时候,accept会返回一个SOCKET(用于识别不同的连接,可以理解成,SOCKET是区分不同连接的ID)。当服务器listen的时候,需要传入某个SOCKET作为listen的参数。至此listen已经与特定的用户绑定。一般的设计架构是:服务器主线程使用accept接收连接,收到一个连接,就创建一个进程或者线程(一般用进程,
Java实现服务器端对多个客户端请求响应
首先,创建一个服务器端的套接字,并规定套接字监听的端口: ServerSocket serverSocket = new ServerSocket(8001); 然后,等待客户端通过端口8001的请求: Socket socket=serverSocket.accept();接下来创建客户端接收到的套接字的输入输出流,并将输入输出流转化成扫描器和写入器: InputStream i
Java Socket 客户端与服务器端的简单交互
一直想了解客户端与服务器之间的底层的一些交互 我刚开始看到关于解析header的一些例子,但是不清楚是客户端呢还是服务器端 后来,我发现,我的想法是有问题的,解析header只是例子的一个体现方式。 客户端 request 服务器 response  不管哪个都有头部信息,所以重点不是在这里。 服务器端是监听某个端口是否有客户端对其进行连接,socket就像是一个管道,client
tcp通讯的方式并使用socket建立客户端与服务器的通信的过程
tcp是一种通讯方式,也叫做tcp协议,是用来规范socket数据交互的。 socket是用来做通讯的。通讯需要通讯双方的ip,socket。举例说两个人打电话,电话就相当于是socket,而打电话的人相当于ip。 socket是用来发送数据和接受数据的,为了确保双方能够正常通信,所以规定了tcp协议。 下面是一个java实现两个程序之间通信的例子:
Socket(套接字)在服务器端和客户端之间的基本工作原理
Socket之间的连接过程主要可以概括为以下三步: 服务器建立监听:客户端初始化Socket动态库后创建套接字,然后指定客户端Socket的地址,循环绑定Socket直至成功,然后开始建立监听,此时客户端处于等待状态,实时监控网络状态; 客户端提出请求:客户端的Socket向服务器端提出连接请求,此时客户端描述出它所要连接的Socket,指出要连接的Socket的相关属性,然后向服务器端S...
socket的accept函数解析以及服务器和多个客户端的端口问题
今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口?     讨论完后,才发现,自己虽然熟悉socket的编程套路,但是却并不是那么清楚socket的原理,今天就趁这个机会,把有关socket编程的几个疑问给搞清楚吧。    先给出一个典型的TCP/IP通信示意图。
Tcp服务端判断客户端是否断开连接
今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的。好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链接的时候才能成功链接。       然后就开始找各种方法。其中简单的是看recv()返回为0,表明断开了链接,但是recv函数始终返回SOCKET_ERROR,找不到原因。。。。。。。。。。。。
服务与客户端建立连接的过程
1、服务器创建监听socket 2、绑定对外服务的端口号 3、开始监听 4、客户端连接到服务对应的端口 5、服务器接受并为客户端产生新的socket 6、服务端基于新socket与客户端交换数据
java Socket 一个服务器与多个客户端进行通信
在实现一个服务器与多个客户端进行通信的时候,此时就需要引入多线程编程,用多个线程同时为多个客户提供服务,这时提高服务器你并发性能最长用的手段,服务器的主线程负责接收客户的连接,每次接收到一个客户连接就会创建一个工作线程,由它负责与客户通信。 多线程的服务器代码实现: public class EChoService { public static void main(String[] arg
基于TCP协议实现服务器和客户端的通信程序
实习期间,项目要求学习MFC编程和SOCKET编程,先写了一个入门的小程序来熟悉一下。 服务器的界面图: 为了简化,将服务器的IP和Port固定为127.0.0.1和5000 【启动】按钮用来启动服务器 代码: void CServerDlg::OnBnClickedStartButton() { // TODO: 在此添加控件通知处理程序代码 if(0 != WSASt
使用ServerSocket、Socket创建一个简单的服务聊天程序
使用ServerSocket创建TCP服务器端: 在两个实心实体没有建立虚拟链路之前,必须有一个通信实体先做出“主动姿态”,主动接收来自其他通信实体的连接请求。 ServerSocket在Java中能接收到其他通信的连接请求,ServerSocket对象用于监听来自客户端Socket的连接请求,ServerSocket使用完毕后再使用它的close()方法将ServerSocke
Java Socket多个客户端与服务器通信
client代码:package com.cqut.test4;import java.io.*; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Scanner;public class Client { priva
socket的连接(三次握手)和关闭过程(四次握手)与服务器各种关闭对客户端的不同影响
之前对socket的TIME_WAIT看的很迷糊,今天在这里总结下,以备今后查看: socket的连接(三次握手)和关闭过程(四次握手): socket状态变迁图: 服务器和客户端各种状态总结: CLOSED:没有使用该套接字 LISTEND:套接字正在监听连接 SYN_SENT:套接字正在试图主动建立连接 SYN_RECEIVED:正在处于建立连接的初始同步
Java Socket实现多个客户端连接同一个服务端
使用Socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再回复客户端一条消息。本人通过自己的思维编写了一份服务端和客户端实现的代码,望能与大家相互学习,共同进步。   服务端代码 import java.io.BufferedReader; import java.io.IOException; import java.i
当客户端socket关闭时,select模型的server端该如何完美的释放掉连接的socket? [问题点数:100分,结帖人guopo]
首先谢谢各位! 我是希望高人给我提供个服务器端的编程模型。 我的服务器端会接收多个客户端的连接,并接收客户端发来的数据。由于我客户端会频繁的连接和关闭,所以我想在客户端关闭之后,服务器端作相应的处理。我是在每个客户端连接后都加入到一个链表中,并开出一个线程用select来检测连接的socket可读性,如果可读,就接收客户端的数据。 更多0分享到: 准备好
java Socket 多个客户端连接同一个服务端
package cn.com.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.ne
Python 一个服务器监听多个客户端请求
学习Python网络通信的时候发现书上只有一个服务端对应一个客户端的情形,于是自己想自己动手实现一个服务端响应多个客户端。 首先建立服务器的socket来监听客户端的请求: tcpSerSock=socket(AF_INET,SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) 这样服务器的监听socket就建好了。 接下来的思路
服务器端应用程序,监听客户端的连接请求,处理各客户端发送来的数据
服务器端应用程序,监听客户端的连接请求,为客户端的连接请求建立Socket队列,处理各客户端发送来的数据。
python 可连接多个客户端的服务器 threading版
还是个简单的多连接的服务器。但是发现这样写貌似就不能实现服务器向客户端发送消息了??? 觉得很迷茫QAQ 之前发现每次连接的时候,消息都不能很好地返回到页面上。发现是因为客户端接受的时候是循环接受的,所以在接受了头部后,就一直阻塞在那里,关不掉。 等等。。。话说为什么我sendall了却不能显示在页面上,要把socket关掉了才能够把消息都打印出来???QAQ 不管了,先上代码QAQ #
java服务器端获取客户端IP地址
在开发工作中,我们常常需要获取客户端的IP。一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 原因:由于在客户端和服务之间增加了中间代理,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。 现在图示代理上网和IP的关系:  第一种情况
用ServerSocket类与Socket类实现客户端与服务端的交互
ServerSocket类,此类实现服务端的套接字,Socket类,此类实现客户端的套接字,而套接字就是两台机器间通信的端点,所以就用ServerSocket类和Socket类实现客户端与服务端的交互,下面先来查看ServerSocket类的api 看到构造方法,首先想到要使用要先new一个,然后方法里可以绑定dao特定端口,这里以端口8888为例,创建一个服务端监听8888端口,然后获取连接着
相关热词 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片 c# 图片颜色调整 最快 c#多张图片上传 c#密封类与密封方法
立即提问