TCP通信:Socket编程

TCP通信:
Socket原理:
简介:Socket通常称为"套接字",支持TCP/IP协议的网络通信的基本操作单元
通常用于描述IP地址和端口,是一个通信链的句柄,在Internet上的主机一般运行了多个软件,
同时提供几种服务,每种服务都打开了一个Socket,并绑到一个端口上,不同的端口对应于不同
的服务.

应用程序通常通过"套接字"向网络发出请求或者应答网络请求,Socket和ServerSocket类位于
java.net包中,ServerSocket用于服务端,Socket是建立网络连接时使用的,在连接成功时,应
用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.

获取本地的地址和端口号
.java.net.Socket为套接字类,其提供了很多的方法,其中我们可以通过Socket获取本地地址
和端口号
-int getLocalPort();
该方法用于获取本地使用的端口号.
InetAddress getLocalAddress();
该方法用于套接字绑定的本地地址

-使用InetAddress获取本地地址的方法
-String getCanonicalHostName()
获取IO地址的完全限定域名//localhost/127.0.0.1

获取远端地址和端口号
.通过Socket获取远端的地址以及端口号
-int getPort();
该方法用于获取远端使用的端口号
IntAddress.getIntAddress();
该方法用于获取套接字绑定的远端地址

3.聊天室案例V1.
使用java的Socket实现客户端和服务器之间的连接,并使客户端向服务端发送一条信息
通信过程如下:
    客户端                                服务端
1.客户端发送"你好,服务器"              2.接收客户端的信息,并显示

方案:
步骤一:先创建客户端类Client
步骤二:创建Socket实例
步骤三:创建客户端的工作方法start()
1.首先使用Socket类的getOutputStream方法获取对应socket对象的网络字节输出流对象
2.为了写出数据,构造缓冲字符输出流PrintWriter类的对象,使用该对象的println方法下个
服务器发送数据
3.关闭Socket对象(需要异常处理,在finally语句中关闭)
步骤四:为客户端定义main方法

public class Client {
//    创建Socket实例
    private Socket socket;
    public Client() {
        try {
            socket = new Socket("localhost",8060);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
//客户端工作方法
    public void start() {
        try {
//            获取OutputStream对象
            OutputStream os = socket.getOutputStream();
//            缓冲字符输出流
            OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
            PrintWriter pw = new PrintWriter(osw,true);
            pw.println("HelloWorld!");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
          try {
                if(socket!=null) {
                socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
                }
        }
    public static void main(String[] args) {
        Client c = new Client();
        c.start();
    }
}


步骤五:创建服务端类
1.在Server类中声明全局变量serverSocket表示一个服务器端的serverSocket对象
步骤六:创建start方法,用于读取客户端的信息
1.首先监听客户端的连接,得到socket对象
2.使用Socket类的getInputStream方法获取对应的Socket对象的网络字节输入流对象
3.构建缓冲字符输入流对象,利用readLine方法获取客户端发送来的数据
4.关闭Socket对象

public class Server {
    
    private ServerSocket serverSocket;
    Server(){
        try {
            serverSocket = new ServerSocket(8060);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void start() {
        System.out.println("等待客户端的连接");
//        监听客户端的连接
        try {
            Socket socket = serverSocket.accept();
            System.out.println("客户端已经连接");
            InputStream in = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(in,"UTF-8");
            BufferedReader br = new BufferedReader(isr);
            System.out.println("客户端说:"+br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Server s = new Server();
        s.start();
    }
    
}


测试:先启动服务端,在开始客户端

测试网络输入流和网络输出流
通过Socket获取输入流和输出流,这两个方法是用Socket通讯的关键

close()
使用Socket进行通讯完毕后,要关闭Socket以释放系统资源
-void close();
关闭套接字,当关闭该套接字后也会同时关闭由此获取的输入输出流

Server端ServerSocket监听.
创建时指定服务端口号,之后监听Socket的连接.
//创建ServerSocket并申请服务器端口为8060
ServerSocket serverSocket = new ServerSocket(8060);
监听
Socket socket = server.accept();
//方法会产生阻塞,直到某个Socket连接,并返回请求连接的Socket
 

猜你喜欢

转载自blog.csdn.net/CXY_ZPH/article/details/86512889