美文网首页
java通过Socket实现TCP网络通信

java通过Socket实现TCP网络通信

作者: Clannad_汐 | 来源:发表于2017-08-04 02:58 被阅读0次
    • 因为在一次实验中用到了Socket实现TCP网络通信,写个博客为了,为了方便日后使用,也可以供大家参考。

    • 客户端Client.java代码:

    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 Client {
        public static void main(String[] args) {
            try {
                //1.创建客户端Socket,指定服务器地址和端口
                Socket socket=new Socket("localhost", 8888);
                //2.获取输出流,向服务器端发送信息
                OutputStream os=socket.getOutputStream();//字节输出流
                PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
                pw.write("用户名:alice;密码:789");
                pw.flush();
                socket.shutdownOutput();//关闭输出流
                //3.获取输入流,并读取服务器端的响应信息
                InputStream is=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String info=null;
                while((info=br.readLine())!=null){
                    System.out.println("接收到服务器消息:"+info);
                }
                //4.关闭资源
                br.close();
                is.close();
                pw.close();
                os.close();
                socket.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 服务端Server.java代码:
    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.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /*
     * 基于TCP协议的Socket通信,实现用户登陆
     * 服务器端
     */
    public class Server {
        public static void main(String[] args) {
            try {
                //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
                ServerSocket serverSocket=new ServerSocket(8888);
                Socket socket=null;
                //记录客户端的数量
                int count=0;
                System.out.println("***服务器启动成功,等待连接:***");
                //循环监听等待客户端的连接
                while(true){
                    //调用accept()方法开始监听,等待客户端的连接
                    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) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 为了实现服务器能一直循环接收客户端的消息,所以建一个线程类ServerThread.java代码:
    
    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 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 {
                //获取输入流,并读取客户端信息
                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();//调用flush()方法将缓冲输出
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                //关闭资源
                try {
                    if(pw!=null)
                        pw.close();
                    if(os!=null)
                        os.close();
                    if(br!=null)
                        br.close();
                    if(isr!=null)
                        isr.close();
                    if(is!=null)
                        is.close();
                    if(socket!=null)
                        socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:java通过Socket实现TCP网络通信

          本文链接:https://www.haomeiwen.com/subject/rdnmlxtx.html