Java (网络编程)

来源:互联网 发布:effective java中文版 编辑:程序博客网 时间:2024/06/05 07:57

网络编程的基础知识
网络协议与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.javapackage 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 blocke1.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()