网络编程的基础知识
网络协议与TCP/IP
IP地址和Port(端口号)
本地回路的IP地址:127.0.0.1
端口号的范围为0~65535之间,0~1032之间的端口数是用于一些知名的网络服务和应用。
UDP与TCP
TCP 传输控制协议,是面向连接通信协议
UDP 用户数据报协议,是无连接通信协议
什么是Socket?
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接。Socket是TCP/Ip协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
Socket通讯的过程
Server端Listen(监听)某个端口是否有链接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accpt (接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write方法与对方通信。
包括以下四个基本步骤:
(1)创建Socket;
(2)打开链接到Socket的输入/输出流
(3)按照一定的协议对Socket进行读/写操作
(4)关闭Socket
创建Socket
java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端,这是两个封装得非常好的类,使用很方便,其构造方法如下:
Socket(String host ,int port);
Socket(String host,int port,boolean stream);
Socket(InetAddress address,int port);
Socket(InetAddress address,int port,boolean stream);
其中address,host和port分别是双向连接中另一方的IP地址,主机名,端口号,Stream指明Socket是流Socket还是数据报socket
UDP网络程序
DatagramSocket类
DatagramSocket类 用于创建和收发UDP数据包的Socket对象
构造函数:
public DatagramSocket()
public DatagramSocket(int port)
public DatagramSocket(int port,InetAddress laddr)
close()//通知驱动程序释放DatagramSocket ()的资源
send(DatagramPacket p)//发送UDP数据包
receive(DatagramPacket p)//接收UDP数据包
DategramPacket类
如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是发送和接受数据的集装箱。
构造函数:
public DatagramPacket(byte[]buf,int length)
public DatagramPacket(byte[]buf,int length,InetAddress address,int port)
getInetAddress和getPort方法
getData和getLength方法
InetAddress类
InetAddress类是用于表示计算机IP地址的一个类,而在日常应用中的计算机地址是用“192.168.0.1”等字符串的格式来表示的
getBYName()
getHostAddress()
简单的UDP接受和发送程序
最简单的UDP程序
用UDP编写网络聊0天程序
分为三个步骤来完成:
1.编写图形用户界面
2.编写网络消息发送功能
3. 编写网络消息接收功能
Chat.java
package net;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
public class Chat extends Frame {
List lst = new List(6);// 定义列表框
TextField tfIP = new TextField(15);
TextField tfData = new TextField(20);
DatagramSocket ds = null;
public Chat() {
try {
ds = new DatagramSocket(3000);
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
this.add(lst, "Center");// 将列表框增加到窗口的上方
Panel p = new Panel();
this.add(p, "South");// 将Panel增加到窗口的下方
p.setLayout(new BorderLayout());
p.add(tfData, "East");
p.add(tfIP, "West");// 将IP 文本框显示在左边
new Thread(new Runnable() {
public void run() {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
while (true) {
try {
ds.receive(dp);
lst.add(new String(buf, 0, dp.getLength()) + "from"
+ dp.getAddress().getHostAddress() + ":"
+ dp.getPort(), 0);
} catch (IOException e) {
if (!ds.isClosed()) {
e.printStackTrace();
}// TODO Auto-generated catch block
}
}
}
}).start();
tfData.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
byte[] buf;
buf = tfData.getText().getBytes();
try {
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName(tfIP.getText()), 3000);
ds.send(dp);// 取出消息文本框中的数据和IP地址文本的信息
} catch (Exception ex) {
ex.printStackTrace();
}
tfData.setText("");// 清空消息文本的内容
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
ds.close();
dispose();
System.exit(0);
}
});
}
public static void main(String args[]) {
System.out.println("Starting Chat...");
Chat mainFrame = new Chat();
mainFrame.setSize(300, 400);
mainFrame.setTitle("Chat");
mainFrame.setVisible(true);
mainFrame.setResizable(false);// 窗口大小不可变
}
}
TCP网络程序的工作原理
TCP客户端程序与TCP服务器端程序的交互过程:
1. 服务器创建一个ServerSocket然后调用accept方法等待客户来连接
2. 客户端程序创建一个Socket并请求与服务器建立连接
3. 服务器接受客户的连接请求,并创建一个新的Socket与该客户建立专线连接
ServerSocket
构造函数:
public ServerSocket()
public ServerSocket(int port)
public ServerSocket(int port ,int backlog)//backlog用于指定服务器忙的时候保持等待的客户数量
public ServerSocket(int port ,int backlog,InetAddress bindAddr)//InetAddress指定ServerSocket绑定的IP地址
close() //将ServerSocket对象关闭,释放资源。系统将ServerSocket占用的端口分配给其他程序
accept()//等待客户端的连接请求
Socket
构造函数
public Socket()
public Socket(String host,int port)
public Socket(InetAddress ddress)
public Socket()