**Javaソケットプログラミング-奥行き**
ソケットプログラミングTCP/UDP:javaにはクライアントとサービス側の通信を担当する専門クラスがあり、通信の種類は2種類ある:TCPとUDP、TCPは典型的なサービス側/クライアントモデルであり、彼はクライアントとサービス側の接続を通じてjava IOストリームを使用して効果を達成する.UDPでは、通信のためにデータ・レポートを使用しています.tcp通信は専用の接続チャネルを確立し,このチャネルを介して通信を行い,udpはデータグラムの受信送信で通信効果を達成する必要がある.両者の違いは、通信チャネルを確立する必要があるかどうかである.簡単な例を挙げると、TCP通信は電話に相当し、他の人に電話をかけるには、他の人の電話番号を知る必要があります.IPアドレスに相当します.電話が通じると、電話をかける双方の間に信号通路があり、互いに相手の言うことが聞こえ、電話が切れると通信通路が破壊され、この時は何も聞こえなくなります.この时、あなたはメールを送ることができるかどうかを考えることができます.もちろん、UDPはメールを送ることに相当します.私は相手の電話番号を知っているだけで、直接メールを編集して彼に送るだけでいいです.専門の通路を作る必要はありません.しかし、UDPには明らかな欠点があります.だからUDPの欠点はすぐに相手に知られることができなくて、甚だしきに至っては相手が受け取れないかもしれません.しかし,2つの通信方式は実際のプログラミングで互いに結合して使用され,互いに長所と短所を補う.
TCP:tcpには主に2つのクラスがあります.
次に、クライアントについて具体的な例を示します.
}
サービス:
UDPプログラミング:
クライアント:
クライアントはreceive()メソッドを介してサービス側から返されたメッセージを受信すると、通信を完了することができる.
例:クライアント:
サービス:
简単なTCP/UDP通信をここまで绍介します.何か悪いことがあったら、できるだけ指摘してください.そうすれば、共に进歩することができますよね.
TCP:tcpには主に2つのクラスがあります.
Socket
とServerSocket,Socket
はクライアントに使用され、Server Socketはサービス側に使用されます.Socketの使い方:Socket socket = new Socket(ip,port);
で最もよく使われる構造方法の一つで、アドレスがipのサーバに接続することを意味し、ポートがportである.一般的にsocket通信はIOストリームを使用して書き込みと読み取りを行い、クライアントはストリームの中に物を書き、socketはgetInputStream()
とgetOutputStream()
の方法を呼び出すことで出力入力ストリームを取得し、サービス側はストリームの中からデータを読み出した後、ストリームの中に物を書き、クライアントはストリームの中から情報を読み取り、会話を完了する. BufferedWriter bw = new BufferedWriter(new InputStreamWriter(socket.getOutpouStream()));
bw.write("hello world");
// ,
bw.fllush();
`ServerSocket` :`ServerSocket serversocket = new ServerSocket(port)`; , :
// , Socket
Socket socket = serversocket.accept();
// ,
`BufferedReader br = new BufferedReader(new`
InputStreamReader(socket.getInputStream()));
byte[] buf = new byte[2048];
// read , byte ,
int len = in.read(buf);
// byte
System.out.println(new String(buf,0,len) );
:
BufferedReader bo= new BufferedWriter(new InputStreamWriter(socket.getOutputStream()));
String s = " , ";
bo.write(s);
BufferedReader .
次に、クライアントについて具体的な例を示します.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
private int port;
private String address;
private Socket socket;
private BufferedWriter out;
private BufferedReader in;
public Client(int port,String address){
this.port = port;
this.address = address;
}
public void start() throws UnknownHostException, IOException{
//
socket = new Socket(address,port);
//
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//
out.write(" ");
out.flush();
System.out.println(" :");
try{
//while
while(true){
// readLine()
char[] cbuf = new char[2048];
int len = in.read(cbuf);
System.out.println(" :"+new String(cbuf,0,len));
Scanner scan = new Scanner(System.in);
String s = scan.next();
if(!s.equals(" ")){
out.write(s);
out.flush();
}else{
socket.close();
in.close();
out.close();
socket.close();
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
System.out.println(" ");
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws UnknownHostException, IOException{
Client client = new Client(9994,"127.0.0.1");
client.start();
}
}
サービス:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Service {
private BufferedReader in;
private BufferedWriter out;
private ServerSocket serversocket;
private Socket socket;
private int port;
public Service(int port){
this.port = port;
}
public void response() throws IOException, InterruptedException{
try {
//
serversocket = new ServerSocket(this.port);
System.out.println(" :");
// ,
socket = serversocket.accept();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println(" , :"+socket);
//
try{
while(true){
char[] cbuf = new char[2048];
int len = in.read(cbuf);
System.out.println(" :"+new String(cbuf,0,len));
//out.write(" , ");
// out.flush, ,
//out.flush();
Scanner scan = new Scanner(System.in);
String s = scan.next();
if(!s.equals(" ")){
out.write(s);
out.flush();
}else{
serversocket.close();
in.close();
out.close();
socket.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
//
// nextLine, , , ,
} catch (IOException e) {
e.printStackTrace();
}
}
/*public class LogicThread extends Thread{
private BufferedReader in;
private BufferedWriter out;
private ServerSocket serversocket;
private Socket socket;
public LogicThread(BufferedReader in,BufferedWriter out,Socket socket,ServerSocket serversocket){
this.in = in;
this.out = out;
this.socket = socket;
this.serversocket = serversocket;
}
public void run(){
while(true){
}
}
}*/
public static void main(String[] args) throws IOException, InterruptedException{
Service service = new Service(9994);
service.response();
//service.serversocket.close();
}
}
UDPプログラミング:
クライアント:
DatagramSocket: , , :
DatagramSocket ds = new DatagramSocket(); , , ,
DatagramPacket: , , :
String s = "heelo world";
byte[] buf = s.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,Ip,port);
IP , 。
:ds.send(dp);
:
, , :
DatagramSocket ds = new DatagramSocket(port);
:
byte[] buf = new btye[2048]
//
DatagramPacket dp = new DatagramPacket(buf,buf.length);
dp
ds.receive(dp);
:
byte[] buf1 = dp.getData();
System.out.println(new String(buf1,0,buf1.length()));
:
String s = " ";
byte[] buf2 = s.getBytes();
// ip port,
ds.send(buf2,buf2.length,dp.getAddress(),dp.getPort());
クライアントはreceive()メソッドを介してサービス側から返されたメッセージを受信すると、通信を完了することができる.
例:クライアント:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
private int port;
private InetAddress address;
//
private DatagramPacket send;
//
private DatagramPacket recieve;
private DatagramSocket socket;
public Client(int port,InetAddress address){
this.port = port;
this.address = address;
}
public void send() {
// , , , ip ,
try{
socket = new DatagramSocket();
//
Scanner scan = new Scanner(System.in);
while(true){
String s = scan.next();
// byte buf
byte[] buf = s.getBytes();
send = new DatagramPacket(buf,buf.length,address,port);
socket.send(send);
System.out.println(" , ");
//
byte[] rbuf = new byte[2048];
recieve = new DatagramPacket(rbuf,rbuf.length);
//
socket.receive(recieve);
//
byte[] rbuf1 = recieve.getData();
int len = rbuf1.length;
System.out.println(" :"+new String(rbuf1,0,len));
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) throws UnknownHostException{
Client client = new Client(9998,InetAddress.getByName("127.0.0.1"));
client.send();
}
}
サービス:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;
public class Service {
private int port;
private DatagramPacket send;
private DatagramPacket recieve;
private DatagramSocket socket;
public Service(int port){
this.port = port;
}
public void recieve() throws IOException{
//
socket = new DatagramSocket(port);
System.out.println(" ");
//
new LogicThread(recieve,socket);
//System.out.println(" ");
}
public class LogicThread extends Thread{
public DatagramPacket recieve;
public DatagramSocket socket;
public LogicThread(DatagramPacket recieve,DatagramSocket socket){
this.recieve = recieve;
this.socket = socket;
start();
}
public void run(){
try{
//while
while(true){
byte[] rbuf = new byte[2048];
// ,
recieve = new DatagramPacket(rbuf,rbuf.length);
// ,
socket.receive(recieve);
byte[] buf = recieve.getData();
int len = buf.length;
System.out.println(" :"+new String(buf,0,len));
//
Scanner scan = new Scanner(System.in);
String s = scan.next();
byte[] sbuf = s.getBytes();
send = new DatagramPacket(sbuf,sbuf.length,recieve.getAddress(),recieve.getPort());
socket.send(send);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException{
Service service = new Service(9998);
service.recieve();
}
}
简単なTCP/UDP通信をここまで绍介します.何か悪いことがあったら、できるだけ指摘してください.そうすれば、共に进歩することができますよね.