Javaでソケットの

TCPとUDP

それらは、OSIトランスポート層に位置しているTCPとUDPは、アプリケーション層のサポートを提供するために、階層化。TCPは、相互に送信データへの安定した接続を確立する接続指向のネットワーク・トランスポートプロトコル、クライアントとサーバー側の必要性です。UDPはコネクションレスネットワークのためのトランスポートプロトコル、クライアントとサーバーが接続を確立する必要はありませんが、クライアントはそれを送信することができ、関係なく、他が存在するかどうかのパケットを送出しています。

TCP

TCP伝送制御プロトコル)伝送制御プロトコル安定性と信頼性の高い接続され、接続を確立する前に、クライアントとサーバが必要とスリーウェイハンドシェイクをデータ転送処理が複雑であるので、安定した接続が、しかし、より伝送効率が得られるUDPははるかに低いです。典型的には、このようなファイル転送、Webページの表示、メッセージ配信などのシーンで使用される正確なデータを、必要としています。ではJavaのTCPによってSocket和ServerSocket達成二つのクラスのTCPの機能。

1.TCPクライアントソケット
//客户端类
public class TestSocketclient {
	//构造方法
	public TestSocketclient(String ip,int port){
		try {
			@SuppressWarnings("resource")
			Socket socket = new Socket(ip,port);//指明服务器ip和端口号
			//向服务器发送消息
			String data = "hello server";
			OutputStream os = socket.getOutputStream();//输出流就是向服务器发送数据的流
			os.write(data.getBytes());
			
			//接收来自服务器的消息
			InputStream is = socket.getInputStream();//输入流就是接收来自服务器数据的流
			byte[] serverinfo = new byte[1024];
			int n = -1;
			while((n=is.read(serverinfo))!=-1){
				String string = new String(serverinfo,0,n);
				System.out.println(string);
			}
			
			os.close();
			is.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//启动方法,应该让服务器端先启动
	public static void main(String[] args) {
		try {
			new TestSocketclient(InetAddress.getLocalHost().getHostAddress(),8888);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
}
2.TCPサーバーServerSocketを
//服务器端
public class TestServerSocket {
	//构造方法
	public TestServerSocket(int port){
		try {
			ServerSocket ss = new ServerSocket(port);//监听端口
			//接收来自客户端的数据,该方法accept()是阻塞方法,直到接到请求才往下执行。
			Socket accept = ss.accept();
			InputStream is = accept.getInputStream();
			byte[] packet = new byte[1024];
			int n = is.read(packet);
			String string = new String(packet,0,n);
			System.out.println(string);
			//向客户端发送消息
			OutputStream os = accept.getOutputStream();
			os.write("hello client".getBytes());
			
			os.close();
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	//启动方法
	public static void main(String[] args) {
		new TestServerSocket(8888);
	}
}

UDP

UDPユーザーデータグラムプロトコルは)ユーザデータグラムプロトコルは、送信中に彼らしばしば失うパケット、少ない安定したデータ伝送プロトコルですが、あまりにも失うことなく、データの全体的な整合性には影響を与えません。ルックスUDPは、今日残る理由は、放棄されていない、不安定以来、だけでなく、データの損失?それは非常に特別な転送効率を持っているからです。データは、UDP(プレイヤーが属性など)が、そのコンポーネント、QQのチャットツール、リアルタイムのビデオ通話、ビデオ会議などの大部分ではない、すべてがも広く、そのようなオンラインゲームとして、使用されています Javaの使用DatagramSocket実装クラスUDPの機能を。

1.UDPクライアント
//客户端
public class TestUDPclient {
	//构造方法
	public TestUDPclient(String ip,int port){
		
		try {
			//客户端不用在socket上指明ip和port
			DatagramSocket ds = new DatagramSocket();
			
			byte[] buf = "nihao 服务器".getBytes();
			int length = buf.length-4;//必须是绑定数据的大小,不能大于,可以小于,不能为负
			InetAddress address = InetAddress.getByName(ip);
			//在数据报上指明服务器的ip和port
			DatagramPacket dp = new DatagramPacket(buf,length, address, port);
			//发送数据
			ds.send(dp);
			//关闭套接字
			ds.close();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//启动方法
	public static void main(String[] args) {
		new TestUDPclient("localhost",7777);
	}
}
2.UDPサーバ
//服务器端
public class TestUDPServer {
	//构造方法
	public TestUDPServer(int port){
		try {
			
			DatagramSocket ps = new DatagramSocket(port);//监听port端口是否有请求
			byte[] b= new byte[1024];
			DatagramPacket pd = new DatagramPacket(b, 1024);//准备一个空包接收数据用
			//接收数据
			ps.receive(pd);
			//得到数据并打印
			byte[] data = pd.getData();
			System.out.println(new String(data,0,data.length));
			//关闭套接字
			ps.close();
		} catch (Exception e) {
		}
	}
	//启动方法
	public static void main(String[] args) {
		new TestUDPServer(7777);
	}

}
3.補足

UDP使用中のDatagramSocketクラスが実装クライアントとサーバーが同じクラスを使用している、彼らが設定したポート番号とIPかどうか、サーバーとクライアントで区別されています。限りポートとIPのDatagramSocketの構成と、サーバとして動作することができます。しかし、スローガンの下端と同じIPアドレスができない、またはポートが異常によって占め報告します。谁先接收数据谁先启动以下は例示であり:

  • クライアント
public class TestUDPclient {
	
	public TestUDPclient(String ip,int port){
		
		try {
			//作为端口号为8888的服务器端
			DatagramSocket ds = new DatagramSocket(8888);
			
			byte[] buf = "nihao 服务器".getBytes();
			int length = buf.length;
			InetAddress address = InetAddress.getByName(ip);
			DatagramPacket dp = new DatagramPacket(buf,length, address, port);
			
			ds.send(dp);
			//发送后再来接收数据
			DatagramPacket dp2 = new DatagramPacket(new byte[1024], 1024);
			ds.receive(dp2);
			byte[] data = dp2.getData();
			System.out.println(new String(data,0,data.length));
			
			ds.close();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new TestUDPclient("localhost",7777);
	}
}
  • サーバー側
public class TestUDPServer {
	
	public TestUDPServer(int port){
		try {
			//作为端口号为7777的服务器端
			DatagramSocket ps = new DatagramSocket(port);
			byte[] b= new byte[1024];
			DatagramPacket pd = new DatagramPacket(b, 1024);
			
			ps.receive(pd);
			
			byte[] data = pd.getData();
			System.out.println(new String(data,0,data.length));
			//接收完数据再发送,发送给本地端口号为8888的服务器端
			DatagramPacket dp2 = new DatagramPacket("nihao".getBytes(),5,InetAddress.getByName("localhost"),8888);
			ps.send(dp2);
			
			ps.close();
		} catch (Exception e) {
		}
	}
	
	public static void main(String[] args) {
		new TestUDPServer(7777);
	}

}
リリース6元記事 ウォンの賞賛2 ビュー510

おすすめ

転載: blog.csdn.net/wl12346/article/details/104840355