Java 之Socket通信(二)

来源:互联网 发布:淘宝退换货说明 编辑:程序博客网 时间:2024/05/18 06:36

TCP协议是面向连接的、可靠的、有序的,以字节流方式发送数据的。
这里写图片描述
步骤实现:
1创建ServerSocket和Socket
2.代开链接到的Socket的输入/输出流
3.按照协议对Socket进行读写操作
4.关闭输入输出流,关闭Socket
基于TCP协议的Socket通信需要的是客户端和服务器端的相互的通信,所以服务器端应该建立ServerSkocket;
服务器端的实现过程如下:
1.创建ServerSocket对象,绑定监听端口
2.通过accept()方法监听客户端的请求
3.连接建立后,通过输入流读取客户端发送的请求信息
4.同过输出流向客户端发送响应信息
5.关闭相关资源

import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;//基于TCP协议的Socket通信   public class SeverTest {    public static void main(String[] args){        //创建一个服务器端的Socket,即ServerSocket指定绑定的        //端口        try {            ServerSocket serverSocket = new ServerSocket(8888);            Socket socket=null;            //记录客户端数量            int count=0;            //2.调用accept()方法开始监听,等待客户端连接            System.out.println("****服务器即将启动****");            while(true){                socket=serverSocket.accept();                //通过当前线程,实现                ServerThread serverthread = new ServerThread(socket);                //启动线程                serverthread.start();                count++;                System.out.println("当前客户端数量:"+count);                InetAddress address = socket.getInetAddress();                System.out.println("当前客户端的IP:"+address.getHostAddress());            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

为了能够实现多个客户同时访问服务端,结合多线程来进行设计:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;public class ServerThread extends Thread {    Socket socket = null;    public ServerThread(Socket socket){        this.socket=socket;    }    //线程执行的操作,响应客户端的请求    public void run(){        InputStream is = null;        InputStreamReader isr  = null;        BufferedReader br = null;        OutputStream os = null;        PrintWriter pw = null;        try {            //3.获取一个输入流,用来读取客户端锁发送的登陆信息            is = socket.getInputStream();            //将字节输入流包装成字节输入流            isr = new InputStreamReader(is);            //添加缓冲            br = new BufferedReader(isr);            String info = null;            while((info=br.readLine())!=null){                System.out.println("我是服务器,服务器说:"+info);            }            //关闭输入流            socket.shutdownInput();            os = socket.getOutputStream();            pw = new PrintWriter(os);            pw.write("欢迎您!");            pw.flush();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            if(pw!=null)                pw.close();             if(os!=null)                try {                    os.close();                } catch (IOException e3) {                    // TODO Auto-generated catch block                    e3.printStackTrace();                }            if(br!=null)                try {                    br.close();                } catch (IOException e3) {                    // TODO Auto-generated catch block                    e3.printStackTrace();                }            if(isr!=null)                try {                    isr.close();                } catch (IOException e2) {                    // TODO Auto-generated catch block                    e2.printStackTrace();                }            if(is!=null)                try {                    is.close();                } catch (IOException e1) {                    // TODO Auto-generated catch block                    e1.printStackTrace();                }            if(socket!=null)                try {                    socket.close();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }    }    }    public static void main(String[] args) {        // TODO Auto-generated method stub    }}

客户端的设计:

package com.imooc.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class ClientTest {   public static void main(String[] args){       //创建客户端的Socket,指定服务器的地址和端口号       try {        Socket socket = new Socket("localhost",8888);        //获取输出流,向服务器端发送消息        OutputStream os = socket.getOutputStream();        PrintWriter pw = new PrintWriter(os);        pw.write("用户名:admin;密码:123");        pw.flush();        //关闭socket的资源        socket.shutdownOutput();        InputStream is = socket.getInputStream();        BufferedReader br = new BufferedReader( new InputStreamReader(is));        String info = null;        while((info=br.readLine())!=null){            System.out.println("我是客户端,服务器说:"+info);        }        br.close();        is.close();        pw.close();        os.close();        socket.close();    } catch (UnknownHostException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (IOException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }   }}

启动服务器端控制台结果为:
这里写图片描述

客户端启动控制台输出结果为:
这里写图片描述
这里是服务器端做出的响应

服务器端做出了反映:
这里写图片描述
验证得到客户端发送的数据已经到达服务器端。这样就实现了基于Socket的TCP协议的通信过程。