网络通讯要素
1.IP地址
网络中的设备标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
2.端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0!1024系统使用或保留端口
3.传输协议
通讯协议
常见协议:TCP UDP
UDP
将数据及源和目的封装在数据包中,不需要建立连接
每个数据包的大小限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
通过UDP协议发送数据:
package 网络编程;
import java.io.*;
import java.net.*;
public class UDP发送数据 {
public static void main(String[] args) throws IOException {
//创建UDP服务
DatagramSocket p=new DatagramSocket();
//括号内可指定发送端的端口数字标识
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
//创建流通道来将数据输入到缓冲区中
String line=null;
while((line=buf.readLine())!=null){
if("886".equals(line)){
break;
}
byte []s=line.getBytes();
//创建包来封装源和目的
DatagramPacket q = new DatagramPacket(s,s.length, InetAddress.getByName("192.168.255.1"),10000);
//将数据写到包中并发送
p.send(q);
}
p.close();
}
}
通过UDP协议接收数据:
package 网络编程;
import java.net.*;
public class UDP接收数据 {
public static void main(String[] args) throws Exception {
创建套接字用来接收数据
DatagramSocket m=new DatagramSocket(10000);
while (true){
byte[] bytes1 = new byte[1024];
//此时最大为1024*8,因为UDP传输协议的限定
DatagramPacket n = new DatagramPacket(bytes1, bytes1.length);
//创建数据包接收数据
m.receive(n);
//将数据写入包中
String ip = n.getAddress().getHostAddress();
System.out.println(ip);
int port = n.getPort();
//打印发送端的端口
System.out.println(port);
String data = new String(bytes1, 0, bytes1.length);
System.out.println(data);
}
}
}
TCP
建立连接。形成传输数据的通道
在连接中进行大数据的传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
TCP协议发送数据:
package 网络编程;
import java.io.*;
import java.net.Socket;
public class File客户端 {
public static void main(String[] args) throws IOException {
Socket s=new Socket("192.168.1.144",10000);
//创建TCP服务
BufferedReader bufr=new BufferedReader(new FileReader("Demo.txt"));
//创建输入流通道指向Demo文件
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//创建输出流通道指向服务通道
String line=null;
while((line=bufr.readLine())!=null){
pw.println(line);
//将读取到的文件内容发送给客户端
//println会自动换行而且会自动刷新缓冲区,若不刷新缓冲区则数据传送不过去
}
s.shutdownOutput();
/* 关闭输出流,给服务端一个读取结束标志-1,若不给提示则会在下边readLine方法阻塞导致客户端无法关闭,
如果没有此判断挑不出循环不能将上传成功反馈给客户端,两边都会卡死*/
BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
//创建输入流接收来自服务端的反馈
String str= bufin.readLine();
System.out.println(str);
//打印反馈信息
pw.close();
//关闭打印流
s.close();
//关闭服务流
}
}
TCP协议接收数据:
package 网络编程;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class File服务端 {
public static void main(String[] args) throws IOException {
ServerSocket s=new ServerSocket(10000);
//创建服务端
Socket s1=s.accept();
//连接客户端
String ip=s1.getInetAddress().getHostAddress();
System.out.println(ip+"连接成功");
//判断是否连接成功
BufferedReader bufin=new BufferedReader(new InputStreamReader(s1.getInputStream()));
//创建输入流接收客户端的信息,输入流连向服务通道
PrintWriter out=new PrintWriter("Demo1.txt");
//创建输出流并指向Demo.txt文件
String line=null;
while((line=bufin.readLine())!=null){
out.println(line);
//将客户端发来的信息传送到文件
}
PrintWriter out1=new PrintWriter(s1.getOutputStream());
out1.println("上传成功");
out.close();
out1.close();
s.close();
}
}