Java Socket 通信 (二)

来源:互联网 发布:云计算的节点 编辑:程序博客网 时间:2024/05/03 13:58

前言:我组长看了我的上一篇博客 Java Socket 通信 (一)他说,“你写的这个相当于http请求。

http请求的过程就是客户端申请建立tcp连接 连接成功后客户端发送报文到服务器服务器处理完成以后把结果返回给客户端然后断掉连接。

我们目前使用的场景是tcp长连接客户端可以随时发送请求服务器也可以随便写过来推送,你尝试着在改一下代码变成在同一个连接的上可以发送多次请求。” 

想起来也是,于是在组长的指导下,我重新构建了Server端和Client端。以一个聊天的小程序为例

首先,不管是服务器还是客户端,都需要时时刻刻,监听着对方发过来的消息。只要发过来消息,我们就打印。但我们也要输入文字后,发送消息。所以就需要两个独立的线程分别处理这件事了。一个在主线程处理,一个在新创建的线程中处理。于是,我新建了一个类 ChatThread。

package com.demi.rx;import java.io.DataInputStream;import java.io.IOException;import java.net.Socket;/** * Created by demi on 16/10/13. */public class ChatThread implements Runnable {    private Socket s = null;    DataInputStream dis =null;    public ChatThread(Socket s){        this.s = s;    }    @Override    public void run() {        try {            dis =new DataInputStream(s.getInputStream());            while(true){                System.out.println(dis.readUTF()); //打印来自客户端或服务器的数据            }        } catch (IOException e) {            e.printStackTrace();        }    }}
接下来是Server端代码:

package com.demi.rx;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner;/** * Created by demi on 16/10/12. */public class Server {        public static void main(String args[]){        ServerSocket ss = null;        Socket s= null;        DataInputStream dis = null;        DataOutputStream dos = null;        Thread chat = null;        try {            ss =new ServerSocket(3320);            s = ss.accept();            System.out.println("Client :"+ s.getInetAddress() + " : " +s.getPort() + "已连接》》》》》》");            dos =new DataOutputStream(s.getOutputStream());            chat = new Thread(new ChatThread(s));            chat.start();            while(true){                Scanner sc=new Scanner(System.in);                dos.writeUTF("Server :"+ sc.nextLine());//写入数据到客户端            }        } catch (IOException e) {            e.printStackTrace();            try {                dis.close();                dos.close();                s.close();                ss.close();                chat.stop();                System.out.print("链接已断开");            } catch (IOException e1) {                e1.printStackTrace();            }        }    }}
然后 Client端代码:

package com.demi.rx;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import java.util.Scanner;/** * Created by demi on 16/10/12. */public class Client extends Socket{    public static void main(String args[]){        DataOutputStream dos =null;        Thread chat = null;        Socket socket = null;        try {            socket =new Socket("127.0.0.1",3320);            dos =new DataOutputStream(socket.getOutputStream());            chat = new Thread(new ChatThread(socket));            chat.start();            while(true){                Scanner sc=new Scanner(System.in);                dos.writeUTF("客户端" + socket.getInetAddress()+":"+ sc.nextLine());//写入数据到服务器端            }        } catch (IOException e) {            e.printStackTrace();            try {                dos.close();                socket.close();                chat.stop();                System.out.print("链接已断开");            } catch (IOException e1) {                e1.printStackTrace();            }        }    }}
先启动Server端,再启动Client端,运行结果如图:

            

1 0
原创粉丝点击