网络编程
例子
以聊天程序为例子:
-
找到网络上的一台机子
聊天需要有一个接受发送方和接受方,那么问题来了,怎么确定一台网络上的机子呢?
我们可以通过ip地址和端口,定位到这台计算机上的某个资源 -
找到机子以后怎么进行数据传输?
网络编程的要素
一:获取双方地址:
IP地址
端口号
二:网络通信协议
http,ftp,smtp,tcp,udp…
这里我们采用TCP/IP:重点学习传输层
IP
ip地址:InetAddress
ip的分类
- ipv4/ipv6
- 公网(互联网)—私网(局域)
此类分为两类:
1.ABCDE类地址
2.192.168.xx.xx专门给组织内部使用 - 域名:解决ip记忆问题
端口
端口表示计算机上一个程序的进程,用于区分软件
端口的分类:
- 公有端口:0-1023
- 程序注册端口:1024-49151,分配用户或者程序
- 动态、私有:49152-65535
关于察看端口命令行的命令:
netstat -ano 察看所有的端口
netstat -ano|findstr "5900" 察看指定端口
tasklist|findstr "8080" 察看指定端口
下面演示一个图片传输的聊天程序:
消息发送需要有一个用户层,一个服务层
服务层:
package com.lrj.chat;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ImgService {
public static void main(String[] args) throws Exception {
//1.创建一个服务端口
ServerSocket serverSocket = new ServerSocket(8081);
//监听客户端的连接
Socket socket = serverSocket.accept();
//获取输入流
InputStream is = socket.getInputStream();
//文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端接受完毕
OutputStream os = socket.getOutputStream();
os.write("我接收完了".getBytes());
//关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
用户层:
package com.lrj.chat;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ImgClient {
public static void main(String[] args) throws IOException {
//1.创建一个socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8081);
//创建一个输出流
OutputStream os = socket.getOutputStream();
//文件流
//1.读取文件
FileInputStream fis = new FileInputStream(new File("tuzaizi.jpg"));
//2.写出文件
byte[] buffer = new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//我已经传输完了
socket.shutdownOutput();
//确定接受关闭
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[2024];
int len2 ;
while((len2=is.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
//关闭资源
fis.close();;
os.close();
socket.close();
}
}