小豆子0722 2015-10-14 13:58 采纳率: 20%
浏览 7986
已采纳

使用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条回答 默认 最新

  • 毕小宝 博客专家认证 2015-10-14 23:02
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 fluent无法启动
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架
  • ¥15 有关sql server business intellige安装,包括SSDT、SSMS。