网络编程学习
基础知识
-
通信要素一:IP和端口号
-
IP唯一的标识 Internet上的计算机(通信实体)
-
在java中使用InetAddress类代表IP
-
IP分类:IPV4和IPV6;万维网和局域网
-
本地回路地址:127.0.0.1对应着localhost
-
如何实例化InetAddress:两个方法:getByName(String host)、本机的IP:getLocalHost()
-
常用方法: 域名:getHostName 本机地址:getHostAddress
-
.端口号:
-
不同进程有不同的端口号
-
被规定为一个16位的整数0~65535
-
端口分类:公认端口:0~1023.被预先定义的服务通信占用(如FTP占用端口21);注册端口:1024~49151.分配给用户进程或应用程序如MYSQL占用端口3306;动态私有端口:49152~65535
-
-
端口号和IP地址在一起组合的出一个网络套接字:Socket
@Test
public void test() throws UnknownHostException {
//获取IP
InetAddress inet1=InetAddress.getByName("192.168.10.14");
System.out.println(inet1);
InetAddress inet2=InetAddress.getByName("www.atguigu.com");
System.out.println(inet2);
//获取本机IP地址
InetAddress inet3=InetAddress.getByName("127.0.0.1");
System.out.println(inet3);
InetAddress inet4=InetAddress.getLocalHost();
System.out.println(inet4);
//获取域名和主机地址
System.out.println(inet2.getHostName());
System.out.println(inet2.getHostAddress());
}
TCP
-
示例一
//客户端
@Test
public void client(){
Socket socket= null;//服务端端口号
OutputStream os= null;
try {
//1.创建Socket对象,指明服务器端IP和端口号
InetAddress inet=InetAddress.getByName("127.0.0.1");
socket = new Socket(inet,8848);
//2.获取一个输出流,用于输出数据
os = socket.getOutputStream();
//3.写出数据的操作
os.write("你好".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
//资源的关闭
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
}
//服务端
@Test
public void server() throws IOException {
//1.创建服务端SeverSocket,指明自己的端口号
ServerSocket ss = new ServerSocket(8848);
//2.调用accept方法表示接收来自于客户端的socket
Socket socket=ss.accept();
//3.获取输入流
InputStream is=socket.getInputStream();
//4.读取输入流的数据
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[5];
int len;
while((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
//5.资源的关闭
baos.close();
is.close();
socket.close();
ss.close();
}
-
示例二:实现交互
@Test
public void client() throws IOException {
//1.
InetAddress inet=InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(inet,8849);
//2.
OutputStream os = socket.getOutputStream();
//3.
FileInputStream fis=new FileInputStream(new File("李沁.jpg"));
byte[] buffer=new byte[5];
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
socket.shutdownOutput();//表示传完了
//4.接收反馈信息
InputStream is =socket.getInputStream();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer1=new byte[5];
int len1;
while((len1=is.read(buffer1))!=-1){
baos.write(buffer1,0,len1);
}
System.out.println(baos.toString());
//5.资源关闭
is.close();
baos.close();
fis.close();
os.close();
socket.close();
}
@Test
public void server() throws IOException {
//1.
ServerSocket ss = new ServerSocket(8849);
//2.
Socket socket=ss.accept();
//3.获取输入流
InputStream is=socket.getInputStream();
//4.读取输入流的数据
FileOutputStream fos=new FileOutputStream(new File("李沁1.jpg"));
byte[] buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//read方法阻塞,后面的不走了,不知道传媒传完,仍在接收
//5.反馈
OutputStream os=socket.getOutputStream();
os.write("谢谢".getBytes());
//6.资源的关闭
fos.close();
is.close();
os.close();
socket.close();
ss.close();
}
-
流的关闭部分偷懒了
UDP
@Test
public void test() throws IOException {
DatagramSocket socket=new DatagramSocket();
String str="我是。。。。";
byte[] data=str.getBytes();
InetAddress inet=InetAddress.getByName("127.0.0.1");
DatagramPacket packet =new DatagramPacket(data,0,data.length,inet,8847);
socket.send(packet);
socket.close();
}
@Test
public void test1() throws IOException {
DatagramSocket socket=new DatagramSocket(8847);
byte[] buffer=new byte[100];
DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}