Java网络编程基本知识点
- 创建服务器(ServerSocket)
- Socket
- InetAddress 描述IP地址的类
- URL类(统一资源定位符)
创建服务器(ServerSocket)
1.用于创建服务器,创建完毕会绑定一个端口号。
2.等待客户端连接
3.每连接一个客户端。服务器就会得到一个新的Socket对象,用于跟客户端通信
// 常用构造方法
// 创建一个基于TCP/IP协议的服务器,prot的范围是0-65535(建议1025-65535)
ServerSocket(int prot)
// 常用方法、
// 等待客户端连接
// 次方法会导致线程阻塞
//直到一个新的客户端连接成功。return Socket对象后,线程在继续执行。
Socket accept();
// void close()
// 释放占用的端口号,关闭服务器
Socket
两台计算机之间通信的端点,是网络驱动提供应用程序的一一种接口,一套标准,一种机制
// 构造方法
Socket(String ip,int port)
//ip地址,服务器软件端口号
// 常用方法
//返回指向通信的另一端点的输出流
OutputStream getOutputStream();
//返回指向通信的另一端点的输入流
InoutStream getInputStream();
// 关闭套接字
void close();
注意
在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的
客户端的输入流, 输入的是服务器的输出流 输出的内容.
客户端的输出流, 输出到了服务器的输入流中.
所以 在使用时, 需要注意以下一点规则:
客户端与服务器获取流的顺序必须是相反的:
例如:客户端先得到了输入流 , 那服务器必须先获取输出流
案例:echo程序
客户端:
//1.连接服务器
Socket socket = new Socket("192.168.102.228",8888);
//2.得到输出流
//2.1 得到输出流
OutputStream os = socket.getOutputStream();
//2.2 将输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
//3.得到输入流
//3.1 得到输入流
InputStream is = socket.getInputStream();
//3.2 将字节输入流, 转换为字符输入流 , 并转换为逐行读取流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//4.循环接收用户输入
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("请输入要发送给服务器的内容:");
String text1 = input.nextLine();
//5.用输出打印流 将用户输入的内容, 发送给服务器
ps.println(text1);
//6.逐行读取流 接收服务器回复的消息
String text2 = br.readLine();
System.out.println(text2);
}
服务器端:
public static void main(String[] args) throws Exception {
//1.启动服务器, 并侦听8888端口号
ServerSocket server = new ServerSocket(8888);
//*2.打印提示
System.out.println("服务器已启动 , 等待客户端连接中...");
//3. 等待客户机连接
Socket socket = server.accept();
System.out.println("一个客户机连接成功:"+socket.getInetAddress().toString());
//4.获取输入流
//4.1 获取输入流
InputStream is = socket.getInputStream(is);
//4.2 将输入的字节流 ,转换为字符流
InputStreamReader isr = new InputStreamReader(is);
//4.3 将字符流, 转换为逐行读取流
BuffereReader br = new BuffereReader(isr);
//5. 获取输出流
//5.1 获取输出流
OutputStream os = socket.getOutputStream();
//5.2 将字节输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
while(true) {
//6. 循环读取一行行的数据 ,读取操作会导致线程的阻塞, 直到客户端真的发送了数据,
//服务器才能接到, 顺序继续执行下面的代码
String text = br.readLine();
//7. 将这个文字, 再打印给客户端
ps.println("服务器"+text);
if("886".equals(text)) {
break;
}
}
InetAddress 描述IP地址的类
得到InetAddress对象的方法:
InetAddress ip = InetAddress.getByName(“192.168.102.228”);
在UDP协议中. 通过数据包DatagramPacket的getAddress方法, 可以得到数据包来自哪个ip
在TCP协议中, 通过套接字Socket的getInetAddress方法, 可以得到套接字连接的ip地址.
//常用方法
String getHostAddress();
//获取Ip地址字符串
String getHostName()
//计算机名称,当无法获取时,获取Ip地址
URL类(统一资源定位符)
//3.1 创建一个网址对象(统一资源定位符)
URL url = new URL(urlString);
//3.2 打开链接 , 并得到链接对象
URLConnection conn = url.openConnection();