Socket通信、TCP/UDP
6036 ワード
UDP:非接続に基づいて構築される;安全性が低い.伝送速度が高い.データ量の少ないデータ
クライアント:(app,ブラウザ)サーバ側:ホストに等しくない
注意:作業中は、まずサービス側を実行し、リスニング状態にしてからクライアントを実行する必要があります.
DatagramSocket datagramSocket = new DatagramSocket();
/**
*
* :
* :
* :
* :
*/
byte[] buf = "bingbing".getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 521);
datagramSocket.send(packet);
datagramSocket.close();
DatagramSocket socket = new DatagramSocket(521);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
3.データの受信---サーバが実行されると、このメソッドは常にリスニングされます.
socket.receive(packet);
//
byte[] bs = packet.getData();
System.out.println(new String(bs));//
4.関連オブジェクトを閉じる
socket.close();
例:随時送信随時受信を実現
クライアント:
DatagramSocket socket = new DatagramSocket();
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
String date = null;
while((date = bReader.readLine())!=null) {
DatagramPacket packet = new DatagramPacket(date.getBytes(), date.getBytes().length,InetAddress.getLocalHost(),1234);
socket.send(packet);
String string = new String(packet.getData()).trim();
if (string.equals("over")) {
break;
}
}
socket.close();
サーバ側:
DatagramSocket socket = new DatagramSocket(1234);
while(true) {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String string = new String(packet.getData()).trim();
System.out.println(string);
if (string.equals("over")) {
break;
}
}
socket.close();
TCP
クライアントがサーバ側と通信する際には、クライアントに対して着信と出力を行う.そのため、Socket内部には入力ストリームと出力ストリームが内蔵されており、データ転送時にSocketオブジェクトの内部にデータを入れ、Socketオブジェクトをサーバ側に転送することで、クライアントとサーバ側の間にチャネルが確立され、両端に同じSocketオブジェクトが使用される
Socket socket = new Socket(InetAddress.getLocalHost(), 526);
2.データの準備
String date = "BigData1812, ";
3.ソケット内部の出力ストリームを取得する
OutputStream o = socket.getOutputStream();
4.ネットワークにデータを書き込む
o.write(date.getBytes());
5.サーバ側から転送されたデータ
InputStream inputStream = socket.getInputStream();
byte[] ar = new byte[1024];
int num = inputStream.read(ar);
System.out.println(new String(ar, 0, num));
5.ストリームを閉じる
socket.close();
ServerSocket serverSocket = new ServerSocket(526);
2.ソケットの接続を受信し、クライアントとサーバ側が同じsocketオブジェクトを使用していることを保証する---常に傍受状態である
Socket socket = serverSocket.accept();
3.入力フローの取得
InputStream inputStream = socket.getInputStream();
4.コンテンツをコンソールに書き込む
byte[] ar = new byte[1024];
int num = inputStream.read(ar);
System.out.println(new String(ar, 0, num));
5.サーバのデータをクライアントに書き込む
OutputStream outputStream = socket.getOutputStream();
outputStream.write(" ".getBytes());
6.該当するオブジェクトを閉じる
socket.close();
クライアントとサーバのTCP通信を文字ストリームで実現
Socket socket = new Socket(InetAddress.getLocalHost(),121);
入力ソースを取得し、コンソールを入力ソースとする
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
入力ストリームを取得し、ネットワークに出力
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream,true);// true , , print,println
サーバから送信されたデータを受信
InputStream inputStream = socket.getInputStream();
BufferedReader brReader1 = new BufferedReader(new InputStreamReader(inputStream));
入力ストリームをネットワークに転送
String date = null;
while((date = bReader.readLine())!=null) {
printWriter.println(date);
// ,
// over
if ("over".equals(date)) {
break;
}
String getDate = brReader1.readLine();
System.out.println(""+getDate);
}
クローズフロー
bReader.close();
brReader1.close();
printWriter.close();
socket.close();
ServerSocket serverSocket = new ServerSocket(121);
ソケットを使用した接続は、クライアントとサーバ側が同じsocketを使用することを保証します.
Socket socket = serverSocket.accept();
入力フローの取得
InputStream inputStream = socket.getInputStream();
BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream));
出力ストリームの取得
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
データを読み取り、希望するデータをユーザー側に返す
String date = null;
while((date = bReader.readLine())!=null) {
// ,
//System.out.println(date.toUpperCase());
printWriter.println(" --->:"+date.toUpperCase());
// over
if ("over".equals(date)) {
break;
}
}
クローズフロー
bReader.close();
printWriter.close();
serverSocket.close();