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);
}
}