TCP的服务端在收不到消息的时候,会一直处于等待状态,核心代码:Socket accept = serverSocket.accept();
UDP的发送和接收不经过三次握手,允许存在失败丢失的情况。
1.TCP代码 1.1 服务器端 public class SocketTcpServer {
public static void main(String[] args) throws IOException {
// 创建Server Socket
ServerSocket serverSocket = new ServerSocket();
// 创建我们的 Socket 监听连接地址和端口号
SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
// 绑定我们的监听地址
serverSocket.bind(address);
// 等待接受请求
System.out.println("等待客户端发送消息..");
// 此代码监听是否完成三次握手,如果执行完则继续,否则一直阻塞等待
Socket accept = serverSocket.accept();
// 获取OutputStream流
PrintWriter socketOut = new PrintWriter(accept.getOutputStream());
byte buf[] = new byte[1024];
if (accept.getInputStream().read(buf) > 0) {
System.out.println("服务器端接受到客户端消息:" + new String(buf));
}
// 服务器端响应消息
String sendStr = "我是jarye";
socketOut.write(sendStr);
socketOut.flush();
// 关闭所有连接
socketOut.close();
accept.close();
serverSocket.close();
}
}
1.2 客户端 public class SocketTcpClient {
public static void main(String[] args) throws IOException {
// 创建socket
final Socket socket = new Socket();
// 创建socket地址
SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
socket.connect(address);
// 创建PrintWriter
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
BufferedReader socketIn = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 向服务器发送的内容
String sendStr = "客户端问服务器端:你是jarye吗?";
socketOut.write(sendStr);
socketOut.flush();
String receiveStr = socketIn.readLine();
System.out.println("服务器端回复:: " + receiveStr);
// 关闭连接
socketOut.close();
socketIn.close();
socket.close();
}
}
2.UDP代码 2.1 服务端代码 /*
* 接收客户端发送的数据
*/
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
//2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];
//创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
//此方法在接收到数据报之前会一直阻塞
socket.receive(packet);
//4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info);
/*
* 向客户端响应数据
*/
//1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "大家好啦~~".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();
2.2 客户端代码 /*
* 向服务器端发送数据
*/
//1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "大家好吗?".getBytes();
//2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
//3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//4.向服务器端发送数据报
socket.send(packet);
/*
* 接收服务器端响应的数据
*/
//1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
//2.接收服务器响应的数据
socket.receive(packet2);
//3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
//4.关闭资源
socket.close();
3.使用Socket模拟Http服务器 public class HttpTest {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
//一直监听,直到受到停止的命令
while (true ) {
Socket socket = null ;
try {
//如果没有请求,会一直hold在这里等待,有客户端请求的时候才会继续往下执行
socket = serverSocket.accept();
//获取输入流(请求)
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line = null ;
//得到请求的内容,注意这里作两个判断非空和""都要,只判断null会有问题
while ((line = bufferedReader.readLine()) != null
&& !line.equals("")) {
stringBuilder.append(line).append("<br>");
}
String result = stringBuilder.toString();
System.out.println(result);
//这里第二个参数表示自动刷新缓存
PrintWriter printWriter = new PrintWriter(
socket.getOutputStream(), true );
printWriter.println("HTTP/1.1 200 OK");
printWriter.println("Content-Type:text/html;charset=utf-8");
printWriter.println();
printWriter.println("<h5>你刚才发送的请求数据是:<br>");
//将日志输出到浏览器
printWriter.write(result);
printWriter.println("</h5>");
// release
printWriter.close();
bufferedReader.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
----------------------------
原文链接:https://www.jianshu.com/p/46193726459b
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 flybird 在 2021-08-30 22:01:55 重新编辑]
网站系统异常
系统异常信息
Request URL:
http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3855
java.lang.NullPointerException
如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员 。