javaSE TCP, ServerSocket, Socket

1、TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。

2、区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。

3、而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

4、UDP主要关注接收端监听接收端的端口号;TCP主要关注服务器端的端口号


TCPServer.java(服务器端):

package cn.xxx.demo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 *  实现TCP服务器程序
 *    服务器端套接字类: java.net.ServerSocket
 *    客户端套接字类: java.net.Socket
 *  构造方法:
 *    ServerSocket(int port) 传递端口号
 *  
 *  注意: 必须要通过accept()方法,获得客户端的套接字对象Socket
 */
public class TCPServer {
	public static void main(String[] args) throws IOException{
		ServerSocket server = new ServerSocket(8888); // 创建服务器端套接字,指定端口号
		Socket socket = server.accept();  // 通过accept()方法,获取客户端套接字。 会阻塞线程,直到获取到客户端连接的套接字。
		
		//通过客户端套接字socket,获取字节输入流;读取客户端发送来的数据
		InputStream in = socket.getInputStream();
		byte[] data = new byte[1024];
		int len = in.read(data);  // 从字节输入流中读取数据到字节数组中,返回读取长度
		System.out.println(new String(data,0,len));
		
		//通过客户端套接字socket,获取字节输出流;向客户端写数据
		OutputStream out = socket.getOutputStream();
		out.write("收到,谢谢".getBytes()); 
		
		InetAddress inet = socket.getLocalAddress(); // 通过客户端套接字,获取客户端IP对象
		
		socket.close();  // 关闭资源。  同时会关闭套接字中的输入、输出流
		server.close();  // 关闭资源
	}
}
TCPClient.java(客户端):
package cn.xxx.demo;  
  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.Socket;  
  
public class TCPClient {  
    public static void main(String[] args)throws IOException {  
        //创建Socket对象,连接服务器。 构造函数一执行,就会进行TCP连接(连接失败,抛异常)  
        Socket socket = new Socket("127.0.0.1", 8888); // 创建客户端套接字,指定服务器地址和服务器端口号  
        //通过客户端的套接字Socket,获取字节输出流,将数据写向服务器  
        OutputStream out = socket.getOutputStream();  
        out.write("服务器OK".getBytes());  
        
        //socket.shutdownOutput();  //给服务器写终止序列;同时会关闭输出流(服务器端会读到流结尾标志"-1")。上传文件时,客户端可以从本地文件流中读到流结束标志"-1",但不能将流结束标志也同时输出(写)到服务端,需要手动再写一个流结束标志。
          
        //通过客户端的套接字Socket,获取字节输入流,读取服务器端的数据  
        InputStream in = socket.getInputStream();  
        byte[] data = new byte[1024];  
        int len = in.read(data);  
        System.out.println(new String(data,0,len));  
          
        socket.close();  // 关闭资源。 同时会关闭套接字中的输入、输出流  
    }  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值