Java---net(网络编程)---TCP

TCP

    建立连接,形成传输数据的通道。
    在连接中进行大数据量传输
    通过三次握手完成连接,是可靠协议
    必须建立连接,效率会稍低

TCP传输

    Socket和ServerSocket
    建立客户端和服务器端
    建立连接后,通过Socket中的IO流进行数据的传输
    关闭socket 
    同样,客户端与服务器端是两个独立的应用程序。


TCP传输编程

基本思路(客户端)

    1.客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
    2.连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(), getOutputStream()获取即可。
    3.与服务端通讯结束后,关闭Socket。

基本思路(服务器端)

    1.服务端需要明确它要处理的数据是从哪个端口进入的。
    2.当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
    3.当该客户端访问结束,关闭该客户端。


代码演示:

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
/**
 * 2018年5月10日 上午10:48:32
 * @author <a href="mailto:[email protected]">宋进宇</a>
 *	通过 Socket 模拟网络通信中的客户端
 */
public class SocketClient {
	//这里为了代码 简洁 直接抛异常
	public static void main(String[] args) throws IOException {
		//这一句是尝试着 跟 服务器端 建立连接
		Socket s = new Socket( InetAddress.getByName( "127.0.0.1" ), 8888 );
		//能到这里说明可以进行 数据传输
		System.out.println( "连接服务器成功" );
		//获取 Socket 中的输入流
		InputStream in = s.getInputStream();
		BufferedReader br = new BufferedReader( 
								new InputStreamReader( in, "UTF-8" ) );
		//接收 服务器端 发来的信息
		System.out.println( br.readLine() );
		s.close();
	}
}

服务器端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 2018年5月10日 上午10:48:54
 * @author <a href="mailto:[email protected]">宋进宇</a>
 *  通过 ServerSocket 模拟网络通信中的服务器端
 */
public class SocketServer {
	//这里为了代码 简洁 直接抛异常
	public static void main(String[] args) throws IOException {
		//打开服务器端的接口 等待 客户端通过 ip+端口号 来访问
		ServerSocket server = new ServerSocket( 8888 );
		
		//这一步数阻塞的,当客户端和服务器端建立连接成功时 返回 Socket s
		//才能 执行后续代码
		Socket s = server.accept();
		
		//能到这里说明 服务器端 与某个 客户端建立了连接
		System.out.println( "与某个客户端连接成功" );
		//获取 输出流
		OutputStream out = s.getOutputStream();
		//发送 一则消息 给用户
		out.write( "你好用户".getBytes( "UTF-8" ) );
		s.close();	
		server.close();
	}
}

TCP传输最容易出现的问题

客户端连接上服务端,两端都在等待,没有任何数据传输。
通过例程分析:

    因为read方法或者readLine方法是阻塞式。

解决办法:

    自定义结束标记
    使用shutdownInput,shutdownOutput方法。

猜你喜欢

转载自blog.csdn.net/qq_34928644/article/details/80289367