一,socket编程
1,udp通信
udp客户端发送数据:
package udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.SocketException;
public class UdpSend {
public static void main(String[] args) throws Exception {
DatagramSocket client = new DatagramSocket();
byte[] bytes = "this is a data".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, Inet4Address.getByName("10.74.131.7"), 10000);
client.send(datagramPacket);
client.close();
}
}
udp服务端代码,一个支持udp协议的服务器:
package udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
public class UdpRece {
public static void main(String[] args) throws Exception {
DatagramSocket sever = new DatagramSocket(10000);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
sever.receive(datagramPacket);
System.out.println(datagramPacket.getAddress().getCanonicalHostName() + ":" + datagramPacket.getPort() + new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
sever.close();
}
}
2,tcp协议:并发上传
客户端代码
package tcp;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args) throws IOException {
SendFile sendFile = new SendFile();
new Thread(sendFile).start();
new Thread(sendFile).start();
new Thread(sendFile).start();
new Thread(sendFile).start();
new Thread(sendFile).start();
new Thread(sendFile).start();
new Thread(sendFile).start();
}
private static class SendFile implements Runnable {
@Override
public void run() {
try {
Socket socket = new Socket("10.74.131.7", 11000);
FileInputStream inputStream = new FileInputStream("/Users/lucy6/Desktop/trash.mp4");
OutputStream outputStream = socket.getOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
System.out.println("上传成功啊");
}catch (IOException e) {
}
}
}
}
服务端代码,一个支持tcp协议的服务器
package tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketSever {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(11000);
while (true) {
Socket accept = serverSocket.accept();
SaveFile saveFile = new SaveFile(accept);
new Thread(saveFile).start();
}
}
private static class SaveFile implements Runnable {
private Socket accept;
public SaveFile(Socket socket) {
this.accept = socket;
}
@Override
public void run() {
try {
int i = 0;
InputStream inputStream = accept.getInputStream();
File file = new File("test" + i++ + ".mp4");
while (file.exists()) {
file = new File("test" + i++ + ".mp4");
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = -1;
while ((len = inputStream.read(buf)) != -1) {
fileOutputStream.write(buf, 0, len);
}
fileOutputStream.flush();
fileOutputStream.close();
inputStream.close();
accept.close();
}catch (IOException e) {
}
}
}
}
3,http协议编程
二,总结
1,服务器原理
浏览器就是一个客户端,底层就是实现了socket编程。
服务器底层也是实现socket编程,只不过进行高度的封装。
服务器可以并发接收多个请求,即是这个原理:
while (true) {
Socket accept = serverSocket.accept();
SaveFile saveFile = new SaveFile(accept);
new Thread(saveFile).start();
}