网络编程
用语言(Java)实现多台计算机的通信
网络编程三大要素
IP地址:每一台计算机的唯一标识
IP采用"点分十进制"的形式标识(如:192.168.3.100),方便记忆
IP分类:A类、B类、C类、D类、E类
IP组成:网络号码+主机地址
端口:指的是逻辑端口
每一个网络程序都会至少有一个逻辑端口;用于标识进程的逻辑地址,不同进程的标识不同
有效端口:0-65535,其中0-1024系统使用或者保留端口
协议
UDP协议
把数据打包、数据有限制、面向无连接、不可靠、速度快
举例:新闻推送、QQ聊天室(群聊)
TCP协议
建立连接通道、数据无限制、面向连接(三次握手)、可靠、速度慢
举例:蓝牙、QQ单聊、打电话
InetAddress类
public static InetAddress getByName(String host):根据主机名获取IP地址
public String getHostAddress():返回IP地址字符串(文本形式)
public String getHostName():返回IP地址的主机名
DatagramSocket类
构造方法:
public DatagramSocket()
public DatagramSocket(int port)
方法:
public void receive(DatagramPacket p):接收数据并把数据存入到DatagramPacket数据包中
public void send(DatagramPacket p):发送DatagramPacket数据包
public void close():释放资源
public static InetAddress getByName(String host):根据主机名获取IP地址
public String getHostAddress():返回IP地址字符串(文本形式)
public String getHostName():返回IP地址的主机名
DatagramPacket类
构造方法:
public DatagramPacket(byte[] buf,int length)
public DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
方法:
public InetAddress getAddress():返回发送端或者接收端的IP地址
public byte[] getData():返回将要接收或者要发送的数据
public int getLength():返回将要接收或者要发送数据的长度
public int getPort():返回发送端或者接收端的端口号
UDP网络程序:
应用程序:网络编程、IO、多线程
*
* UDP协议接收端:
* 1、创建接收端Socket对象
* 2、创建数据包对象
* 3、接收
* 4、解析接收到的数据并显示在控制台
* 5、释放资源
*/
public class ReceiveThread implements Runnable {
@Override
public void run() {
try {
DatagramSocket ds = new DatagramSocket(10086);
while(true){
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength()) + "from"
+ dp.getAddress().getHostAddress() + ":" + dp.getPort();
System.out.println(str);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* UDP协议发送端:
* 1、创建发送端Socket对象
* 2、创建数据并封装数据
* 3、发送
* 4、释放资源
*/
public class SendThread implements Runnable {
@Override
public void run() {
try {
DatagramSocket ds = new DatagramSocket(2222);
// 键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
byte[] bys = line.getBytes();
// 封装数据
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("Nina"), 10086);
ds.send(dp);
}
// 释放资源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 应用程序:网络编程,IO,多线程
*/
public class ChatRoom {
public static void main(String[] args) {
ReceiveThread rt = new ReceiveThread();
SendThread st = new SendThread();
Thread t1 = new Thread(rt);
Thread t2 = new Thread(st);
t1.start();
t2.start();
}
}
TCP网络程序:
/*
* TCP协议服务器端步骤:
* 创建服务器端Socket对象
* 监听连接
* 获取输入流,读取数据并显示
* 释放资源
*/
public class ServerDemo {
public static void main(String[] args) throws IOException{
ServerSocket ss = new ServerSocket(22222);
Socket s = ss.accept();
//读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//写入到文本文件中
PrintWriter pw = new PrintWriter(new FileWriter("Out.java"),true);
String line =null;
while((line=br.readLine())!=null){
pw.println(line);
}
//写入反馈数据
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
out.println("文件上传成功");
//释放资源
pw.close();
s.close();
}
}
/*
* 需求:客户端向服务器端上传文本文件
* TCP协议客户端步骤:
*创建客户端Socket对象并建立连接
*获取输出流,写入数据
* 释放资源
*/
public class ClientDemo {
public static void main(String[] args) throws IOException{
Socket s = new Socket("Nina",22222);
//写入
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
//读取文本文件数据
BufferedReader br = new BufferedReader(new FileReader("Test.java"));
String line =null;
while((line=br.readLine())!=null){
pw.println(line);
}
s.shutdownOutput();
//读取服务器反馈数据
BufferedReader brServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
String server =brServer.readLine();
System.out.println("server:"+server);
//释放资源
br.close();
s.close();
}
}