java socket编程
在这里主要介绍tcp协议,tcp协议需要熟悉的两个类分别是socket和serverSocket,掌握了这两个类中常用的方法,结合线程和流的知识,我们就可以进行socket编程啦,下面是一个比较经典的例子。
需求 : 实现服务端给多个客户端发送图片并统计下载的人数(重复ip不算)
服务器端程序代码实现如下所示
public class ImageServer implements Runnable{
private Socket socket;
//hashset集合用于统计人数,因为hashset集合不能存储重复元素,所以刚好合适
//如果使用继承方式实现多线程,必须声明为静态才能被共享,推荐使用实现接口的方式实现多线程
HashSet<String> ips = new HashSet<String>();
public ImageServer(Socket socket){
this.socket = socket;
}
public static void main(String[] args) {
try {
//建立tcp服务端,给定端口号,必须和客户端一致,服务端需要始终保持开启的状态
ServerSocket server = new ServerSocket(9090);
while(true){
//不断接受客户端连接
Socket socket = server.accept();
//一个用户分配一个线程
ImageServer imageServer = new ImageServer(socket);
new Thread(imageServer).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//获取客户端的输出流对象
OutputStream outputStream = socket.getOutputStream();
//创建一个图片文件的输入流读取文件
FileInputStream fileInputStream = new FileInputStream("C://Users//Public//Pictures//Sample Pictures//6630231037350038151.jpg");
//自定义字节数组,接收图片信息并写出
byte[] buf = new byte[1024];
int length = 0;
while((length = fileInputStream.read(buf)) != -1){
outputStream.write(buf,0,length);
}
//获取下载用户的ip
String ip = socket.getInetAddress().getHostAddress();
if(ips.add(ip)){
System.out.println(ip+"成功下载,当前下载的人数是"+ips.size());
}
//关闭资源(先进后关)
fileInputStream.close();
//关闭客户端资源
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端的代码就写完了,整体还是比较基础的,需要对io,thread以及socket有较好的理解,这三个大块都是java基础中比较重要的部分。客户端的代码之后会解析上传。