记得上一次接触socket这一块还是在大三抓耳挠腮的整毕设的时候,两年后的今天又用到了它,那就把Socket实现组播什么的做一个记录吧。
TcpServer
public class TcpServer {
private static boolean isruning = true;
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(5583);
while (isruning) {
// 连接
Socket socket = serverSocket.accept();
System.out
.println("有新客户端(" + socket.getInetAddress() + ")连接。。");
OutputStream stream = socket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(stream);
writer.write("hello socket!");
writer.flush();
writer.close();
System.out
.println("客户端(" + socket.getInetAddress() + ")会话结束。。");
}
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TcpClient
public class TcpClient {
public static void main(String[] args) {
String host = "localhost"; // 要连接的服务端IP地址
int port = 5583; // 要连接的服务端对应的监听端口
try {
// 与服务端建立连接
Socket client = new Socket(host, port);
InputStream inputStream = client.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
String message = bufferedReader.readLine();
System.out.println(message);
bufferedReader.close();
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UdpSend
public class UdpSend {
public static void main(String[] args) {
MulticastSocket socket;
try {
socket = new MulticastSocket(8842);
socket.setTimeToLive(1);
InetAddress address = InetAddress.getByName("233.0.0.0");
socket.joinGroup(address);
byte[] buf = "hello world!".getBytes();
DatagramPacket p = new DatagramPacket(buf, buf.length, address,
8842);
socket.send(p);
System.out.println("广播已经发出");
} catch (IOException e) {
e.printStackTrace();
}
}
}
UdpReceive
public class UdpReceive {
public static void main(String[] args) {
MulticastSocket socket;
try {
socket = new MulticastSocket(8842);
socket.setTimeToLive(1);
InetAddress address = InetAddress.getByName("233.0.0.0");
socket.joinGroup(address);
byte[] buf = new byte[3000];
DatagramPacket p = new DatagramPacket(buf, buf.length);
socket.receive(p);
System.out.println("接受到" + p.getAddress() + "的广播消息"
+ new String(p.getData()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
2019年1月4日16:43:00 更新 ----------------------------------
后来实现的,比上个版本更好一点 贴上来
public class cfg {
public static String ip = "192.168.0.106";
public static int port = 8030;
}
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
// 与服务端建立连接
Socket client = new Socket(cfg.ip, cfg.port);
System.out.println("连接成功!");
new Send(client).start();
new Recerver(client).start();
//socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import java.io.*;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
public class Recerver extends Thread {
Socket socket;
public Recerver(Socket client) {
this.socket = client;
}
@Override
public void run() {
super.run();
InputStream inputStream = null;
try {
inputStream = socket.getInputStream();
for (; ; ) {
DataInputStream stream = new DataInputStream(inputStream);
int head = -1;
while ((head = stream.read()) != 0xff) {
System.out.print("bad data");
}
System.out.print("head:" + head);
int len = stream.readInt();
byte[] data = new byte[len];
stream.read(data, 0, len);
String str = new String(data, Charset.forName("utf-8"));
System.out.println(socket.getInetAddress() + ":" + str);
}
} catch (IOException e) {
System.out.println(socket.getInetAddress() + " 已经断开");
}
}
}
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.Scanner;
public class Send extends Thread {
Socket socket;
public Send(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
try {
OutputStream out = socket.getOutputStream();
Scanner scanner = new Scanner(System.in);
for (; ; ) {
String msg = scanner.nextLine();
byte[] content = msg.getBytes("utf-8");
ByteBuffer byteBuffer = ByteBuffer.allocate(content.length + 5);
byteBuffer.put((byte) 0xff);
byteBuffer.putInt(content.length);
byteBuffer.put(content);
out.write(byteBuffer.array());
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(cfg.port);
System.out.println("服务启动:" + InetAddress.getLocalHost().getHostAddress() + ":" + serverSocket.getLocalPort());
for (; ; ) {
// 连接
Socket socket = serverSocket.accept();
System.out
.println("有新客户端(" + socket.getInetAddress() + ")连接");
new Send(socket).start();
new Recerver(socket).start();
}
//serverSocket.close();
} catch (IOException e) {
System.out.print("服务端异常:" + e.getMessage());
}
}
}