文章目录
网络通信三要素
IP地址
IP地址操作类-InetAddress
端口号
通信协议
UDP通信
双方不用建立连接
一发一收
多发多收
发送端
public class Sender {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp;
Scanner s= new Scanner(System.in);
while (true){
String sendStrings = s.next();
dp = new DatagramPacket(sendStrings.getBytes(), sendStrings.length(), InetAddress.getLocalHost(), 8888);
ds.send(dp);
if (sendStrings.equals("exit")){
break;
}
}
}
}
接收端
public class Receiver {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8888);
byte[] buf = new byte[1024*64];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
while (true){
ds.receive(dp);
String receiveStrings = new String(buf,0,dp.getLength(), StandardCharsets.UTF_8);
if (receiveStrings.equals("exit")){
break;
}
System.out.println(receiveStrings);
}
}
}
广播、组播
TCP通信
客户端
一个简单的客户端的实现
public class Net {
public static void main(String[] args) throws Exception {
//172.18.64.152
Socket socket = new Socket("172.18.64.152",8888);
//获得os流
OutputStream os = socket.getOutputStream();
//将os流包装成打印流
PrintStream ps = new PrintStream(os);
//通过打印流写数据到socket管道
ps.println("hello");
ps.flush();
}
}
服务端
首先,要是使用ServerSocket类注册端口号
public class NetReciever {
public static void main(String[] args) throws Exception{
//注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//等待接收客户端Socket连接
Socket socket = serverSocket.accept();
//获得IS流is
InputStream is = socket.getInputStream();
//将IS流包装成字符输入缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine())!=null){
System.out.println(socket.getRemoteSocketAddress()+":"+msg);
}
}
}
TCP多发多收
public class NetSender {
public static void main(String[] args) throws Exception {
//172.18.64.152
Socket socket = new Socket("172.18.64.152",8888);
//获得os流
OutputStream os = socket.getOutputStream();
//将os流包装成打印流
PrintStream ps = new PrintStream(os);
//通过打印流写数据到socket管道
Scanner s = new Scanner(System.in);
String msg;
while (true){
if ((msg=s.next()).equals("exit")){
break;
}
ps.println(msg);
ps.flush();
}
}
}
public class NetReciever {
public static void main(String[] args) throws Exception{
//注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//等待接收客户端Socket连接
Socket socket = serverSocket.accept();
//获得IS流is
InputStream is = socket.getInputStream();
//将IS流包装成字符输入缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine())!=null){
System.out.println(socket.getRemoteSocketAddress()+":"+msg);
}
}
}
TCP同时接收多个客户端消息
服务器端实现
public class ThreadNetR {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
Socket socket = serverSocket.accept();
new MyThread(socket).start();
}
}
}
class MyThread extends Thread{
private Socket socket;
public MyThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//获得IS流is
InputStream is = socket.getInputStream();
//将IS流包装成字符输入缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine())!=null){
System.out.println(Thread.currentThread().getName()+socket.getRemoteSocketAddress()+":"+msg);
}
}catch (Exception e){
System.out.println(socket.getRemoteSocketAddress()+"下线了");;
}
}
}
使用线程池优化
TCP即时通讯
public class NetReciever {
public static ArrayList<Socket> socketArrayList = new ArrayList<>();
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
Socket socket = serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress()+"上线了");
socketArrayList.add(socket);
new Reciever(socket).start();
}
}
}
class Reciever extends Thread{
private Socket socket;
public Reciever(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine())!=null){
System.out.println(socket.getRemoteSocketAddress()+":"+msg);
for (Socket socket1:NetReciever.socketArrayList){
OutputStream os = socket1.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println(socket1.getRemoteSocketAddress()+":"+msg);
ps.flush();
}
}
}catch (Exception e ){
System.out.println(socket.getRemoteSocketAddress()+"下线了");
NetReciever.socketArrayList.remove(socket); //下线后,清楚集合内的socket
}
}
}
public class NetSender {
public static void main(String[] args) throws Exception {
// ServerSocket serverSocket = new ServerSocket();
// new Thread(new MyReciever(serverSocket.accept())).start();
//172.18.64.152
Socket socket = new Socket("172.18.64.152",8888);
new MyReciever(socket).start();
//获得os流
OutputStream os = socket.getOutputStream();
//将os流包装成打印流
PrintStream ps = new PrintStream(os);
//通过打印流写数据到socket管道
Scanner s = new Scanner(System.in);
String msg;
while (true){
if ((msg=s.next()).equals("exit")){
break;
}
ps.println(msg);
ps.flush();
}
}
}
class MyReciever extends Thread{
private Socket socket;
public MyReciever(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
//将IS流包装成字符输入缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine())!=null){
System.out.println(socket.getRemoteSocketAddress()+":"+msg);
}
}catch (Exception e){
System.out.println("您下线了");
}
}
}