目录
网络编程(多线程)
利用多线程实现多个客户端访问一个服务器。
示例:
SocketThread:
public class SocketThread implements Runnable {
private Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
boolean flag = true;
try {
//将数据进行存储,返回给客户端
PrintStream printStream = new PrintStream(this.socket.getOutputStream());
//获取客户端发送的数据
Scanner scanner = new Scanner(socket.getInputStream());
scanner.useDelimiter("\n");
while (flag) {
//判断是否存在数据
if (scanner.hasNext()) {
String value = scanner.next().trim();
printStream.println("【服务器获取数据。。。】" + value);
if ("bye".equalsIgnoreCase(value)) {
flag = false;
}
}
}
scanner.close();
printStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ServerSocket:
public class ServerTest {
public static void main(String[] args) throws IOException {
boolean flag = true; //控制循环
ServerSocket server = new ServerSocket(6666);
//获取客户端连接实例
System.out.println("服务器已部署,等待客户端连接。。。");
while (flag) {
Socket socket = server.accept();
new Thread(new SocketThread(socket)).start();
}
server.close();
}
}
Socket:
public class SocketTest {
public static void main(String[] args) throws IOException {
final StringUtil stringUtil = new StringUtil();
Socket socket = new Socket("localhost", 6666);
//将数据进行存储,返回给客户端
PrintStream printStream = new PrintStream(socket.getOutputStream());
//获取客户端发送的数据
Scanner scanner = new Scanner(socket.getInputStream());
scanner.useDelimiter("\n");
while (true) {
String value = stringUtil.getString("请输入数据:");
//先进行一次发送,否则数据不能进行传输
printStream.println(value);
if (scanner.hasNext()) {
System.err.println(scanner.next().trim());
}
if("bye".equalsIgnoreCase(value)){
break;
}
}
}
}
public class StringUtil {
public String getString(String str) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
if (str != null && !"".equals(str)) {
System.out.println(str);
str = bufferedReader.readLine();
}
if (str == null || "".equals(str)) {
System.out.println("不可以输入空数据!");
System.out.println("请重新输入:");
str = bufferedReader.readLine();
}
return str;
}
}
UDP
占用资源比TCP少,但稳定性比TCP差,使用广播的形式,客户端没开启就获取不到数据。
DatagramSocket(端口号):设置监听的端口号。
服务器:DatagramPacket(data(内容),start(开始的位置),end(结束的位置),address(IP地址),port(接受的端口号)):设置广播的内容,地址和端口号。
客户端:DatagramPacket(data(byte数组),start(接受的数据开始的位置),end(接受的数据结束的位置)):获取接受的数据存入data数组内
实例:
服务器:
public class UdpServer {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(8888);
String data = "Hello World!!!";
//传输数据的大小,采用转换成字节形式的大小可以保证传输的中文不会少
DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),0,data.getByte().length(), InetAddress.getLocalHost(),9999);
//广播
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
客户端:
public class UdpSocket {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
//获取的数据进行存储
byte[] data = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(data,0,data.length);
//等待有数据获取
datagramSocket.receive(datagramPacket);
System.out.println("【UDP】获取的数据为:"+new String(data,0,datagramPacket.getLength()));
datagramSocket.close();
}
}