标签:socket buffer 编程 网络 packet new port String
网络编程的要素
IP和端口号
网络通信协议
TCP
客户端
- 连接服务器socket
- 发送消息
public static void main(String[] args) throws IOException {
//创建一个socket连接
Socket socket = new Socket(InetAddress.getByName("localhost"), 9000);
//创建一个输出流
OutputStream os = socket.getOutputStream();
//读取文件
FileInputStream fis = new FileInputStream(new File("old.png"));
//写出文件
byte [] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
//关闭资源
fis.close();
os.close();
socket.close();
}
服务端
- 建立服务的端口 ServerSocket
- 等待用户的连接 accept
- 接收用户的消息
public static void main(String[] args) throws IOException {
//创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//监听客户端的连接 阻塞式监听,会一直等待客户端连接
Socket socket = serverSocket.accept();
//获取输入流
InputStream is = socket.getInputStream();
//文件输出
FileOutputStream fos = new FileOutputStream(new File("new.png"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
//关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
UDP
客户端
public static void main(String[] args) throws IOException{
//建立一个socket
DatagramSocket socket = new DatagramSocket();
//创建一个需要发送的包
String data = "Hello,server!";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, localhost, port);
//发送包
socket.send(packet);
//关闭流
socket.close();
}
服务端
public static void main(String[] args) throws IOException {
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet); //阻塞接收
System.out.println(new String(packet.getData(), 0, packet.getLength()));
//关闭连接
socket.close();
}
利用UDP编写简单的聊天通信
分别实现两个线程接口,一个一直发信息,一个一直接收信息。
发送线程
import java.io.*;
import java.net.*;
public class SendThread implements Runnable {
private InetAddress ip;
private int port;
private String role;
private DatagramSocket socket = null;
private DatagramPacket packet = null;
private BufferedReader reader = null;
@Override
public void run() {
while (true) {
try {
String data = reader.readLine();
byte[] datas = (this.role + ":" + data).getBytes();
packet = new DatagramPacket(datas, 0, datas.length, this.ip, this.port);
socket.send(packet);
if (data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
public SendThread (String ip, int port, String role) {
//创建一个socket连接
try {
this.ip = InetAddress.getByName(ip);
this.port = port;
this.role = role;
socket = new DatagramSocket();
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
接收线程
import java.io.IOException;
import java.net.*;
public class ReceiveThread implements Runnable {
private int port;
private DatagramSocket socket = null;
private DatagramPacket packet = null;
@Override
public void run() {
while (true) {
//准备接收包裹
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, 0, buffer.length);
try {
socket.receive(packet); //阻塞接收
} catch (IOException e) {
e.printStackTrace();
}
String data = new String(packet.getData(), 0, packet.getLength());
System.out.println(data);
if (data.equals("bye")) {
break;
}
}
socket.close();
}
public ReceiveThread (int port) {
this.port = port;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
}
通信
//两个客户端分别创建两个线程,就可实现通信了
//老师端
new Thread(new SendThread("localhost", 9000, "老师")).start();
new Thread(new ReceiveThread(9090)).start();
//学生端
new Thread(new SendThread("localhost", 9090, "学生")).start();
new Thread(new ReceiveThread(9000)).start();
效果展示
标签:socket,buffer,编程,网络,packet,new,port,String 来源: https://www.cnblogs.com/bGpi/p/14409370.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。