Socket通信分为两类:TCP和UDP。而TCP和UDP都分为两端。
一,TCP
1,服务器端
package com.jackie.day11;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
PrintWriter pw = null;
try {
ss = new ServerSocket(8888);
s = ss.accept();// 开始监听,一直阻塞程序,直到接收到了客户端的连接就会返回一个代表这个客户端的Socket
System.out.println("客户端来了!");
pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("客户端你好!");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (pw != null) {
pw.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2,客户端
package com.jackie.day11;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
public static void main(String[] args) {
Socket s = null;
BufferedReader br = null;
String str = null;
try {
s = new Socket("192.168.1.100", 8888);
br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8"));
str = br.readLine();
System.out.println(str);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
二,UDP
1,发送端
package com.jackie.day11;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPSender {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
ds = new DatagramSocket();// 发包时不用指定端口号
String data = "UDP发送过来的数据!";
byte[] buf = data.getBytes();
// 创建一个要发送到指定IP地址的指定端口号上的包
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 6666);
ds.send(packet);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
}
}
}
2,接收端
package com.jackie.day11;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 要先运行接收包的程序
*
* @author Administrator
*
*/
public class UDPReceiver {
public static void main(String[] args) {
DatagramSocket ds = null;
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
try {
ds = new DatagramSocket(6666);// 收包时要指定端口号
ds.receive(packet);// 开始接收包,未接收到前,一直阻塞
String str = new String(buf, 0, packet.getLength());
System.out.println(str);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
}
}
}