Java 之Socket通信(二)

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协议的通信过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值