标签:java 编程 网络 bw br new null 客户端
网络编程
软件结构
- Client/Server(C/S结构)
- Browser/Server(B/S结构)
Windows系统中执行命令:
//查看占用8888端口号的进程PID
netstat -aon|findstr 8888
//显示结果,找到占用8888端口号的PID
TCP 0.0.0.0:8888 0.0.0.0:0 LISTENING 2696
//强制关闭(杀死)
taskkill /F /pid 2696
注意,需要使用管理员的权限来运行命令窗口
Ubuntu系统中执行命令:
//查看占用8888端口号的进程PID
netstat -anp | grep :8888
//显示结果,找到占用8888端口号的PID
tcp 0 0 :::8888 :::* LISTEN 3626/java
//强制关闭(杀死)
kill -9 3626
TCP/IP编程
可靠的,面向右连接的
了解客户端和服务端的步骤;
ServerSocket
:服务端
- 创建客户端对象:
serverSocket=new ServerSocket(9909);
- 等待客户端发送socket:
Socket s=serverSocket.accept();
- 获取输入流输出流:
s.getOutputStream();
s.getInputStream();
- 包装流:缓冲流或者对象流
- 读数据写数据
- 关闭资源:
- 关闭流;
- 关闭severSocket.close();
Socket
:客户端
- 创建客户端对象:
Socket s=new Socket("127.0.0.1",9909);
- 获取输入输出流:
- 包装流:
- 读写数据:
- 关闭资源:
案例
package com.chapter12.classcode;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
//服务器端
public static void main(String[] args) {
ServerSocket serverSocket=null;
BufferedReader br=null;
BufferedWriter bw=null;
try {
serverSocket=new ServerSocket(9909);
System.out.println("等待客户端");
//等待客户端发送过来socket
Socket s=serverSocket.accept();
System.out.println("拿到客户端的soket" + s);
//读输入输出流
InputStream in = s.getInputStream();
//包装流
br=new BufferedReader(new InputStreamReader(in));
//读数据,写数据
String readLine = br.readLine();//会造成堵塞,一直等着读数据
System.out.println(readLine);
// OutputStream out = s.getOutputStream();
// bw=new BufferedWriter(new OutputStreamWriter(out));
// bw.write("收到");
// bw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (br!=null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bw!=null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}if (serverSocket!=null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.chapter12.classcode;
import java.io.*;
import java.net.Socket;
public class TcpClient {
//客户端
public static void main(String[] args) {
BufferedWriter bw=null;
BufferedReader br=null;
OutputStream os=null;
Socket s=null;
//创建socket
try {
s=new Socket("127.0.0.1",9909);
//给服务器端写数据
os=s.getOutputStream();
//包装流 先把字节流转换成字符流
bw=new BufferedWriter(new OutputStreamWriter(os));
//读写数据
bw.write("hello world
bw.flush();
/* InputStream in = s.getInputStream();
br=new BufferedReader(new InputStreamReader(in));
String s1 = br.readLine();
System.out.println(s1);*/
} catch (IOException e) {
e.printStackTrace();
}finally {
if (os!=null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}if (bw!=null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}if (br!=null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (s!=null) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
先启动服务端,服务端会等待客户端启动然后建立连接,再启动客户端,
结果如下:
UDP编程
面向无连接的,不可靠的,高效率;
在UDP通信协议下,两台计算机之间进行数据交互,并不需要先建立连接,客户端直接往指定的IP和端 口号上发送数据即可,但是它并不能保证数据一定能让对方收到。
java.net.DatagramSocket
和 java.net.DatagramPacket
是UDP编程中使用到的俩个类,客户端 和服务器端都使用这个俩类
java.net.DatagramSocket
负责接收和发送数据
java.net.DatagramPacket
负责封装要发送的数据和接收到的数据
URL
URI(uniform resource identifier),统一资源标识符,用来唯一的标识一个资源。
URL(uniform resource locator),统一资源定位符,它是一种具体的URI,即URL可以用来标识一个资 源,而且还指明了如何定位这个资源。
例如,http://127.0.0.1/hello ,这就是一个URL,它不仅标识了一个资源,还能定位这个资源。
例如,/hello ,这就是一个URI,它只是标识了一个资源。
标签:java,编程,网络,bw,br,new,null,客户端 来源: https://blog.csdn.net/weixin_45273750/article/details/121603122
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。