网络通讯
网络编程三要素:
IP
ip地址的概述:
ip地址相当于双方的地址,收,寄时都需要一个地址。
ip地址由四个8位二进制数组成
查看ip
在本机可直接使用命令行窗口,输入下列命令:
java获取ip地址和主机名称:
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 查看ip地址
*/
public class ip1 {
public static void main(String[] args) throws UnknownHostException {
//确定主机名可以是IP地址或者主机名称
InetAddress address = InetAddress.getByName("主机名");
String name = address.getHostName();
String ip = address.getHostAddress();
System.out.println("主机名" + "\t" + name);
System.out.println("ip" + "\t" + ip);
}
}
网络通讯协议:
端口:
协议:
UDP:
TCP:
三次握手图示:
UDP
udp传输数据的步骤:
发送端:
import java.io.IOException;
import java.net.*;
public class UDPsenddemo {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//创建数据,并打包数据
//DatagramPacket(byte buf[]//数据打包,int length//数据长度,InetAddress ip ip地址,int port端口号)
byte b[] = "helloword".getBytes();
// int l=b.length;
// InetAddress ip = InetAddress.getByName("10.82.68.16");
// int port=10086;
// DatagramPacket dp=new DatagramPacket(b,l,ip,port);
DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("10.82.68.16"), 10086);
//发送数据
ds.send(dp);
//关闭发送端口
ds.close();
}
}
接收端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPresivedemo {
public static void main(String[] args) throws IOException {
//创建Socket接收端口接收数据
// DatagramSocket(int inport)
DatagramSocket ds = new DatagramSocket(10086);
//创建接收包用于存储接收到的数据
//构造DatagramPackage(byte[] b,int length)方法接收数据
byte b[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
//调用resive方法接收数据
ds.receive(dp);
// //解析数据并在控制台显示
// //byte getData()用于返回数据缓冲区
// byte datas[] = dp.getData();
// //只接收输入过来的长度
// int len = dp.getLength();
// String dataString = new String(datas, 0, len);
// System.out.println("接收到的数据是:" + dataString);
System.out.println("接收到的数据是:" + new String(dp.getData(), 0, dp.getLength()));
//关闭端口
ds.close();
}
}
TCP
TCP传输数据的步骤:
发送端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPsend {
public static void main(String[] args) throws IOException {
//创建客户端对象
Socket s = new Socket("10.82.39.240", 18888);
//获取输出流写数据
OutputStream os = s.getOutputStream();
os.write("helloworld".getBytes());
s.close();
}
}
接收端:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPresive {
public static void main(String[] args) throws IOException {
//创建端口
ServerSocket ss = new ServerSocket(9999);
//第三次握手确认端口
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte b[] = new byte[1024];
int len = is.read(b);
String data = new String(b, 0, len);
System.out.println("接收到的数据是:" + data);
ss.close();
}
练习:
发送端:
package com.IP.TCPandThread;
import java.io.*;
import java.net.Socket;
public class TCPsend {
public static void main(String[] args) throws IOException {
Socket s=new Socket("192.168.21.1",18888);
BufferedReader br=new BufferedReader(new FileReader("javatest\\name.txt"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//自定义终止反馈
// bw.write("886");
// bw.newLine();
// bw.flush();
//给出反馈。停止这次写入
s.shutdownOutput();
/**
* 等待服务器给出反馈
*/
BufferedReader bwserver=new BufferedReader(new InputStreamReader(s.getInputStream()));
String s1 = bwserver.readLine();
System.out.println("服务器给出的反馈为:"+s1);
bwserver.close();
bw.close();
br.close();
s.close();
}
}
客户端:
package com.IP.TCPandThread;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPserver {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(18888);
Socket s = ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw=new BufferedWriter(new FileWriter("copyName.txt"));
String line;
while ((line=br.readLine())!=null){
// 自定义读数据结束的标志
// if ("886".equals(line))
// break;
bw.write(line);
bw.newLine();
bw.flush();
}
/**
* 服务器给出反馈
*/
BufferedWriter bwserver=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwserver.write("文件已接收");
bw.newLine();
bw.flush();
bwserver.close();
bw.close();
br.close();
s.close();
}
}