使用JAVA写的一个简易TCP通讯程序(一)

来源:互联网 发布:协同过滤算法的研究 编辑:程序博客网 时间:2024/05/29 07:59

好记性不如赖笔头…………

使用TCP测试通讯时,注意必须 先启动服务端,否则客户端会报错。因为TCP是需要三次握手的协议,如果服务器没有启动,握手失败,就会提示“连接异常”的错误

而UDP就没有这个问题,因为它是一种广播式的协议,在发送信息前,它不会去检查服务器有没有启动、存在不存在,它只是把消息发出去,好了,它的工作完成了,不管消息被 收到还是没有被收到。所以它才可以不用管启动顺序。

服务端代码:package com.ckinghan.tcpServer;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class TCPServer {    //指定接口    public int port;    //构造方法    public TCPServer(int port) {        super();        this.port = port;        //创建线程并启动        Server server = new Server();        Thread thread = new Thread(server);        thread.start();    }    class Server implements Runnable{        @Override        public void run() {            //创建对象            ServerSocket serverSocket = null;            Socket socket = null;            BufferedReader reader =null;            try {                //实例化对象                serverSocket = new ServerSocket(port);                //提示服务端启动                System.out.println("端口号为:"+port+"的服务启动成功……");                //监听并获取socket                socket = serverSocket.accept();                //获取输入流                InputStream inputStream = socket.getInputStream();                //将字节流转换为字符流                reader = new BufferedReader(new InputStreamReader(inputStream));                //获取IP                InetAddress inetAddress = serverSocket.getInetAddress();                //接收到的信息                String message = null;                //一直循环获取消息                while (true) {                    //如果接收到的消息不为Null                    if((message = reader.readLine()) != null){                        //如果接收到的消息为close或exit,则退出对话                        if("close".equals(message.toLowerCase()) || "exit".equals(message.toLowerCase())){                            System.out.println(inetAddress.getHostAddress()+" 的用户已退出会话");                            break;                        }                        //输出会话的内容                         System.out.println(inetAddress.getHostAddress()+" 的用户说:"+message);                    }                }            } catch (IOException e) {                e.printStackTrace();            }finally {                //关闭流                try {                                       if(reader != null)                        reader.close();                    if(socket != null)                        socket.close();                    if(serverSocket != null)                        serverSocket.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    public static void main(String[] args) {        //启动服务端        new TCPServer(12000);    }}
客户端代码:package com.ckinghan.tcpServer;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;public class TCPClient {    //连接的服务器IP    private String ip;    //连接服务器的端口    private int port;    //构造 方法    public TCPClient(String ip,int port) {        super();        this.ip = ip;        this.port = port;        //创建线程并启动        Client client = new Client();        Thread thread = new Thread(client);        thread.start();    }    class Client implements Runnable{        @Override        public void run() {            //创建对象            Socket socket = null;            BufferedWriter bufferedWriter = null;            BufferedReader bufferedReader = null;            try {                //实例化对象                socket = new Socket(ip, port);                //获取socket的输出流,以便将内容发送给服务器                bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));                //从控制台接收内容                 bufferedReader = new BufferedReader(new InputStreamReader(System.in));                //要发送的内容                String message = null;                //一直循环                while (true) {                    //提示输入                    System.out.print("我说:");                    //如果用户要发送的信息不为null                    if((message = bufferedReader.readLine()) != null){                        //换行                        System.out.println();                        //检查用户是否要退出                        if("exit".equals(message.toLowerCase()) || "close".equals(message.toLowerCase())){                            System.out.println("退出会话成功");                            break;                        }                        //向服务器写入要发送的消息                        bufferedWriter.write(message);                        //注意:这里是重点,换行                        bufferedWriter.newLine();                        //清空缓存将信息发送过去                        bufferedWriter.flush();                    }                }            } catch (UnknownHostException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            } finally {                //关闭流                try {                    if(bufferedWriter != null)                    bufferedWriter.close();                    if(bufferedReader != null)                        bufferedReader.close();                    if(socket != null)                        socket.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    public static void main(String[] args) {        new TCPClient("127.0.0.1",12000);    }}
原创粉丝点击