版权声明:最短的时间最核心的知识,有疑问,欢迎进行留言。 https://blog.csdn.net/lizhidefengzi/article/details/79335545
TCP协议使用
客户端服务器代码:
package xdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args) {
try{
//1.创建ServerSocket类型的对象,并绑定指定的端口
ServerSocket ss=new ServerSocket(8888);
System.out.println("等待客户端的连接请求...");
Socket s=ss.accept();
System.out.println("客户端连接成功!");
//2.等待客户端的连接请求,调用accept()方法
//3.得到Socket类型的对象,使用输入输出流进行通信
//使用BufferReader类来接受客户端发来的内容
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=br.readLine();
System.out.println("客户端发来的数据为:"+str);
//4.关闭相关的资源
s.close();
ss.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端代码
package xdl.day19;
import java.io.PrintStream;
import java.net.Socket;
public class TestClient {
public static void main(String[] args) {
try{
//1.创建Socket类型的对象,并提供服务器IP地址和端口号
Socket s=new Socket("169.254.167.40",8888);
//2.使用输入输出流进行通信
//使用PrintStream类向服务器发送字符串内容“hello”
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println("hello");
System.out.println("成功发送数据到服务器");
//3.关闭相关的资源
ps.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
练习:
- 要求客户端发送的内容由用户手动输入,使用BufferedReader类。
- 要求服务器收到客户端的消息之后,向客户端回发消息“I Receieved!”
- 要求服务器和客户端可以不断进行通信,当客户端发送“bye”时结束通信。
- 要求服务器能够同时支持多个客户端的连接,而且能够和多个客户端同时聊天,多线程。
服务线程
package xdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ServerThread extends Thread {
private Socket s;
public ServerThread(Socket s){
this.s=s;
}
@Override
public void run(){
try{
//只要有客户端连接成功,则应启动一个新线程为之服务,主线程始终接待
//2.等待客户端的连接请求,调用accept()方法
//3.得到Socket类型的对象,使用输入输出流进行通信
//使用BufferedReader类来接受客户端发来的内容
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream ps=new PrintStream(s.getOutputStream());
while(true){
String str=br.readLine();
if("bye".equalsIgnoreCase(str))break;
System.out.println("客户端发来的数据为:"+str);
//向客户端回发消息
//使用PrintStream类向服务器发送字符串内容“I Received!”
ps.println("I Received!");
System.out.println("成功发送数据到客户端!");
}
//4.关闭相关的资源、
ps.close();
br.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
服务器
package xdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args) {
try{
//1.创建ServerSocket类型的对象,并绑定指定的端口
ServerSocket ss=new ServerSocket(8888);
while(true){
System.out.println("等待客户端的连接请求...");
Socket s=ss.accept();
System.out.println("客户端"+s.getInetAddress()+"连接成功!");
//只要有客户端连接成功,则应启动一个新线程为之服务,主线程始终进行接待
new ServerThread(s).start();
}
//ss.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端
package xdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class TestClient {
public static void main(String[] args) {
try{
//1.创建Socket类型的对象,并提供服务器IP地址和端口号
Socket s=new Socket("169.254.167.40",8888);
//2.使用输入输出流进行通信
//提示用户输入要发送的内容,并使用变量记录
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintStream ps=new PrintStream(s.getOutputStream());
BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true){
System.out.println("请输入要发送的内容:");
String str=br.readLine();
//使用PrintStream类向服务器发送字符串内容“hello”
ps.println(str);
System.out.println("成功发送数据到服务器");
//使用BufferReader类来接受客户端发来的内容
String str2=br2.readLine();
if(str2.equalsIgnoreCase(str2))break;
System.out.println("服务器发来的数据为:"+str2);
}
//3.关闭相关的资源
br.close();
br2.close();
ps.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
UDP协议使用
接收方
package xdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class TestClient {
public static void main(String[] args) {
try{
//1.创建Socket类型的对象,并提供服务器IP地址和端口号
Socket s=new Socket("169.254.167.40",8888);
//2.使用输入输出流进行通信
//提示用户输入要发送的内容,并使用变量记录
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintStream ps=new PrintStream(s.getOutputStream());
BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true){
System.out.println("请输入要发送的内容:");
String str=br.readLine();
//使用PrintStream类向服务器发送字符串内容“hello”
ps.println(str);
System.out.println("成功发送数据到服务器");
//使用BufferReader类来接受客户端发来的内容
String str2=br2.readLine();
if(str2.equalsIgnoreCase(str2))break;
System.out.println("服务器发来的数据为:"+str2);
}
//3.关闭相关的资源
br.close();
br2.close();
ps.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
发送方
package xdl.day19;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class TestSend {
public static void main(String[] args) {
try{
//1.创建DatagramSocket类型的对象
DatagramSocket ds=new DatagramSocket();
//2.创建DatagramPacket类型的对象,用于接收数据内容
byte[] data="hello".getBytes();
DatagramPacket dp=new DatagramPacket(data,data.length,
InetAddress.getLocalHost(),8888);
ds.send(dp);
System.out.println("成功发送数据内容!");
//4.关闭套接字
ds.close();
///2.创建DatagramPacket类型的对象,提供接收方的IP地址和端口号
//3.发送数据内容,使用send()方法
//4.关闭套接字
}catch(Exception e){
e.printStackTrace();}
}
}
注意事项:
打印格式出现问题:
解决办法:控制字符串长度,是占位符的原因。
System.out.println("接收到的数据内容是:"+new String(data,0,dp.getLength())+"!");