今天开始又要复习java基础部分的知识了,我最薄弱的就是网络编程,线程,io这几块,趁平时放假好好把这几部分的基础知识补上,为下一轮面试做好准备。今天从Socket入门开始,做了一个小的P2P 的Demo ,其实网络编程也并不是很难,懂一些协议的原理利用java就可以实现两台电脑之间的点对点通信。基本原理就两句话:作为服务器端, ServerSocket 在初始化的时候会不断的去监听客户端的请求,当服务器端接受的客户端Socket的请求的时候,服务器端也会产生一个Socket和客户端对应完成通信的功能;作为客户端,一旦指定Socket 的IP和端口,便可以向服务器对应的端口发送连接请求;由此便可以轻松的实现点对点的通信。缺点就是,只能交互式的你一言我一语,不能完成并发的功能,希望这个回合的复习结束时我能把多线程加上。
Server代码:
package edu.hue.jk.socket;
import java.io.BufferedReader;
/***
*
* @author dell
*作为服务器端, ServerSocket 在初始化的时候会不断的去监听客户端的请求
*当服务器端接受的客户端Socket的请求的时候,服务器端也会产生一个Socket和客户端对应完成通信的功能
*/
public class Server {
public static void main(String[] args)throws Exception {
ServerSocket server=new ServerSocket(30000); // 创建一个ServerSocket用于监听服务器端的请求
while(true){ // 服务器端不断的监听客户端的请求
Socket serverSocket=server.accept(); // 当监听客户端的请求时,服务器端也会产生一个对应的Socket 来处理和客户端之间的通信
PrintStream ps=new PrintStream(serverSocket.getOutputStream());// 得到服务器端Socket的输出流,用来向客户端发送信息
ps.println("您好,服务器已经连接成功");
ps.flush();
System.out.println("服务器连接成功");
InputStream in=serverSocket.getInputStream(); // 得到服务器Socket的输入流,用来读取客户端的内容
BufferedReader read=new BufferedReader(new InputStreamReader(in)); // 将输入流进行包装
String msg=null;
while(true) // 当客户端有信息发送过来的时候,服务器端接受一条数据,并向客户端回复
{
msg=read.readLine();
System.out.println("来自客户端的信息:"+msg);
System.out.println("请输入信息:");
BufferedReader readFromkey=new BufferedReader(new InputStreamReader(System.in)); // 用来从键盘中获取信息
msg=readFromkey.readLine(); // 从键盘中得到信息
ps.println(msg);
ps.flush();
}
// ps.close(); // 关闭打印流 应该try catch finally 这里直接做了异常抛出处理
// serverSocket.close(); // 关闭服务器端socket
}
}
}
Client 代码:
package edu.hue.jk.socket;
import java.io.BufferedReader;
public class Client {
/**
* @param args
* 作为客户端,一旦指定Socket 的IP和端口,便可以向服务器对应的端口发送连接请求
*/
public static void main(String[] args) throws Exception{
Socket client=new Socket("127.0.0.1",30000); // 向指定的服务器发送连接请求
InputStream in=client.getInputStream(); // 得到客户端Socket的输入流,用来读取服务器端的内容
BufferedReader read=new BufferedReader(new InputStreamReader(in)); // 将输入流进行包装
String msg=null;
while(true){ // 只要服务器有信息反馈,客户端就接受信息,并向服务端发送信息
msg=read.readLine();
System.out.println("来自服务器的信息:"+msg);
System.out.println("请输入信息:");
PrintStream write=new PrintStream(client.getOutputStream()); // 包装客户端Socket 的输出流用来向服务器端发送数据
BufferedReader readFromkey=new BufferedReader(new InputStreamReader(System.in)); // 用来从键盘中获取信息
msg=readFromkey.readLine(); // 从键盘中得到信息
write.println(msg);// 向服务器发送信息
write.flush();
}
// finally{
// read.close();
// client.close();s
// }
}
}
在命令行下的测试结果: