TCP
以下代码创建了两个线程,实现服务端和客户端的互相通信。
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) {
try {
//创建ServerSocket对象,用来监听9001端口
ServerSocket server = new ServerSocket(9001);
//监听9001端口客户端发送的请求,该方法在客户端请求到来之前处于阻塞状态,当客户端请求到来时,会创建(返回)一个socket对象与客户端进行通信
Socket socket = server.accept();
Read t = new Read(socket);
Write w = new Write(socket);
t.start();
w.start();
//socket.close();
//server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Read extends Thread{
private Socket socket;
public Read(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s= null;
while((s= br.readLine())!=null){
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Write extends Thread{
private Socket socket;
public Write(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()){
pw.println(scanner.nextLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9001);
Read t = new Read(socket);
Write w = new Write(socket);
t.start();
w.start();
//socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDP
服务端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UServer {
public static void main(String[] args) {
try {
//创建套接字
DatagramSocket ds = new DatagramSocket(8003);
byte[] data = new byte[100];
//创建数据包
DatagramPacket dp = new DatagramPacket(data, data.length);
//接收数据报
ds.receive(dp);
dp.getData();
System.out.println(new String(dp.getData(),0,dp.getLength() ));
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UClient {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket();
byte[] data = "客户端发送数据".getBytes();
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(data,data.length,ip,8003);
ds.send(dp);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
组播
组播的ip地址:224.0.0.0到239.255.255.255
发送端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Random;
public class Sender {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket();
while(true){
byte [] data = getData();
InetAddress ip = InetAddress.getByName("224.0.0.2");
DatagramPacket dp = new DatagramPacket(data, data.length, ip, 8000);
ds.send(dp);
System.out.println(new String(data));
Thread.sleep(1000);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] getData(){
StringBuilder s = new StringBuilder();
Random r = new Random();
for (int i=0;i<10;i++){
s.append((char)(65+r.nextInt(26)));
}
return s.toString().getBytes();
}
}
接受端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Reciever {
public static void main(String[] args) {
try {
MulticastSocket ms = new MulticastSocket(8000);
InetAddress ip = InetAddress.getByName("224.0.0.2");
ms.joinGroup(ip);
while(true){
byte[] data = new byte[11];
DatagramPacket dp = new DatagramPacket(data, data.length);
ms.receive(dp);
//System.out.println(new String(dp.getData(),0,dp.getLength()));
System.out.println(new String(dp.getData(),0,dp.getLength()));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
广播
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。
发送端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Random;
public class BroadcastSender {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket();
while(true){
byte [] data = getData();
InetAddress ip = InetAddress.getByName("255.255.255.255");
DatagramPacket dp = new DatagramPacket(data, data.length, ip, 8000);
ds.send(dp);
System.out.println(new String(data));
Thread.sleep(1000);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] getData(){
StringBuilder s = new StringBuilder();
Random r = new Random();
for (int i=0;i<10;i++){
s.append((char)(65+r.nextInt(26)));
}
return s.toString().getBytes();
}
}
接受端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class BroadcastReceiver {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket(8000);
while(true){
byte[] data = new byte[11];
DatagramPacket dp = new DatagramPacket(data, data.length);
ds.receive(dp);
//System.out.println(new String(dp.getData(),0,dp.getLength()));
System.out.println(new String(dp.getData(),0,dp.getLength()));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}