Java进阶--网络编程
TCP通信
TCP聊天器
Server端
package Socket.demo02;
import java.io.*;
import java.net.*;
public class server {
public static void main(String args[]) {
System.out.println("----------server 启动---------------");
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try{
serverSocket = new ServerSocket(9997);
while(true){ socket = serverSocket.accept();
is = socket.getInputStream();
//管道流,解决中文输出,显示错误的问题
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
System.out.println("收到:"+baos.toString());
}
}catch (IOException e){
e.printStackTrace();
}
finally {
if(baos!=null){
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Client端
package Socket.demo02;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class client {
public static void main(String[] args){
System.out.println("----------client 启动---------------");
Socket socket = null;
OutputStream os = null;
try {
InetAddress serverIP =InetAddress.getByName("127.0.0.1");
int port = 9997;
socket = new Socket(serverIP,port);
os = socket.getOutputStream();
os.write("你好,客户端正在发送消息".getBytes());// 发送消息
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
模拟文件上传
package Socket.demo03;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
public static void main(String[] args) throws IOException {
System.out.println("---------file server------------");
ServerSocket serverSocket = new ServerSocket(9000);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("girl2.png"));
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端
OutputStream os = socket.getOutputStream();
os.write("接收完毕,可以断开..".getBytes());
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
package Socket.demo03;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class FileClient {
public static void main(String[] args) throws IOException {
System.out.println("---------file client------------");
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000); // 创建socket连接//ctr + alt +v
OutputStream os = socket.getOutputStream(); // 创建一个输出流
FileInputStream fis = new FileInputStream(new File("girl.png")); //读取文件
byte[] buffer = new byte[1024]; //写文件
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//通知服务器传输完毕
socket.shutdownOutput();
//确定服务器接收完毕,才能断开
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len2;
while((len2=is.read(buf))!=-1){
baos.write(buf,0,len2);
System.out.println(baos.toString());
}
is.close();
baos.close();
fis.close();
os.close();
socket.close();
}
}
UDP通信
UDP消息发送
接收接收端
package Socket.demo04;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class udpServer {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}
发送端
package Socket.demo04;
import java.net.*;
public class udpClient {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
String msg ="你好服务器";
InetAddress ip = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, ip, port);
socket.send(packet);
socket.close();
}
}
UDP聊天实现+多线程
TalkSend 发数数据线程
package Socket.demo06;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TalkSend implements Runnable {
private int fromPort;
private String toIP;
private int toPort;
DatagramSocket socket = null;
BufferedReader reader = null;
public TalkSend(int fromPort, String toIP, int toPort) {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
try {
socket = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
try{
String data = reader.readLine();
byte[] buffer = data.getBytes();
DatagramPacket packet = new DatagramPacket(buffer,0, buffer.length,new InetSocketAddress(this.toIP,this.toPort));
socket.send(packet);
if(data.equals("bye")){
break;
}
}catch (Exception e){
e.printStackTrace();
}
}
socket.close();
}
}
TalkRecieve 收数据线程
package Socket.demo06;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TalkReceive implements Runnable {
private int port;
private String msgFrom;
DatagramSocket socket = null;
public TalkReceive(int port,String msgFrom) {
this.port = port;
this.msgFrom = msgFrom;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
try{
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0, container.length);
socket.receive(packet);
byte[] data = packet.getData();
String recievedata= new String(data,0,data.length);
System.out.println(msgFrom + ":" + recievedata);
if(recievedata.equals("bye")){
break;
}
}catch (Exception e){
e.printStackTrace();
}
}
socket.close();
}
}
学生端
package Socket.demo06;
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777,"localhost",9999)).start();
new Thread(new TalkReceive(8888,"老师")).start();
}
}
老师端
package Socket.demo06;
public class TalkTeacher {
public static void main(String[] args) {
new Thread(new TalkSend(5555,"localhost",8888)).start();
new Thread(new TalkReceive(9999,"学生")).start();
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步