网络编程指的是让所写的代码在几个设备之间运行,为的是将这些设备通过网络彼此相连。 在J2SE下的java.net
包中的API,提供了一些低级别的类和接口,帮助你专注于解决手上的问题。java,net
包提供了两种网络协议:
TCP 传输控制协议,应许你在两个设备之间建立连接。TCP协议广泛使用与网络协议中,被称为TCP/IP.
UDP 用户数据协议,一种无连接协议,允许数据包在应用程序之间传输。 本文将了解以下两个主题:
Socket Programming ,网络编程中最广泛使用的概念并且也是解释的最清楚的一部分。
URL Processing ,将单独讲解,连接 。Socket Programming Sockets提供了两个电脑相互通讯的机制。客服端在交流后建立了socket并且尝试去链接服务端。 当链接建立过后,服务端也在交流后建立的socket。然后客户端和服务端能够通过写和读来通讯。java.net.Socket
类提供了一个socket,java.net.ServerSocket
类提供了服务端监客户端并建立链接的机制。 以下表示了两台电脑通过tcp建立链接的步骤:
服务端创建 ServerSocket对象,提供那个端口将用于通讯。
服务端调用ServerSocket的accept()
方法。方法将等待之道客户端链接到刚刚指定的端口。
在服务端处于等待的时候,客户端创建Socket对象,并指定需要链接的服务端地址以及端口号。
Socket类的构造方法尝试将客服端与所指的服务端以及端口。如果链接建立了,客户端就有用能和服务端通讯的Socket对象。
在服务端,accept()
方法将返回一个可以与客户端链接成功的Socket对象。 在链接建立成功过后,将通过I/O流的方式进行通讯。每个Socket对象都拥有OutputStream和InputStream。客户端的InputStream链接的是服务端的OutputStream,OutputStream链接的是服务端的InputStream。 Tcp是双向的通讯协议,意味着可以同时在各自的流之间发送数据。以下是提供完整的实现套接字方法的有用类。ServerSocket 类方法
序号
方法和描述
1
public ServerSocket(int port) throws IOException 创建ServerSocket对象并绑定指定的端口,如果端口已经被其他的绑定了抛出异常
2
public ServerSocket(int port, int backlog) throws IOException backlog参数指定了有等待队列将能够存储多少传入客户端
3
public ServerSocket(int port, int backlog, InetAddress address) throws IOException InetAddress参数指定了绑定的本地的地址,InetAddress用于服务端有多个IP地址,指定某个确定的地址用于客户端的绑定
4
public ServerSocket() throws IOException 创建一个非绑定的对象,当你需要绑定服务时调用bind()
来绑定ServerSocket
如果ServerSocket的构造方法没有抛出异常,表明你的程序已经成功的绑定了指定的端口,等待客户端的链接。
ServerSocket的常用方法:
序号
方法和描述
1
public int getLocalPort() 返回服务端监听的端口。这个方法是有用的在你构建的时候传递0作为参数给构造方法,让他自己为你寻找可用的端口。
2
public Socket accept() throws IOException 等待客户端的连入。方法将一直阻塞,知道客户端链接或者等待超时,假设已经过setSoTimeout()
方法设置了超时时间。否者方法将永远阻塞
3
public void setSoTimeout(int timeout) 设置服务端等待客户端连入的等待时间
4
public void bind(SocketAddress host, int backlog) 将套接字绑定到SocketAddress对象中指定的服务器和端口。如果您使用无参数构造函数实例化了ServerSocket,请使用此方法。
当ServerSocket的accept()方法调用后,只有客户端链接过后才会返回。在客户端链接过后,ServerSocket在未指定的端口上创建一个新的Socket,并返回对此新Socket的引用。此后TCP链接将在客户端和服务端之间,回话开始。
Socket 类方法 java.net.Socket
类提供了一个可以和服务端进行交流得到Socket对象。客户端通过创建获得一个Socket对象,服务端通过accept()方法获得Socket对象。 Socket有5个构造方法用于去链接服务端。
序号
方法和描述
1
public Socket(String host, int port) throws UnknownHostException, IOException. 尝试根据指定的服务地址和端口链接服务端。如果不抛出异常表示链接服务端成功
2
public Socket(InetAddress host, int port) throws IOException 跟上面的方法一样,只是服务端的地址是InetAddress对象
3
public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 链接指定服务端地址和端口,并在本地的地址和端口创建socket对象
4
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 于前一个方法类似,只是服务端的地址是一个InetAddress对象而非String
5
public Socket() 创建一个不立即建立的Socket对象。使用connect()方法链接服务端
构造方法返回的不仅仅只是一个Socket对象,而是一个尝试去链接指定地址和端口的服务端的Socket对象。 Socket类的一些常用方法如下一。注意客服端个服务端都有socket对象,所以一下方法两者都可以调用。
序号
方法和描述
1
public void connect(SocketAddress host, int timeout) throws IOException 链接指定的服务端。改方式仅仅只是在调用Socket的无参构造方法时需要需要
2
public InetAddress getInetAddress() 返回电脑中Socket对象的链接地址
3
public int getPort() 返回Socket对象绑定的远程机上的端口
4
public int getLocalPort() 返回Socket对象绑定的本地上的端口
5
public SocketAddress getRemoteSocketAddress() 返回远程Socket对象地址
6
public InputStream getInputStream() throws IOException 返回Socket的输入流,其实与远程的输出流链接
7
public OutputStream getOutputStream() throws IOException 返回Socket的输出流,其与远程的输入流链接
8
public void close() throws IOException 关闭Socket,是的Socket对象不再能够再次连接到任何服务器
## InetAddress 类方法
这个类表示Internet 协议地址即IP。下面是Socket编程中常用的方法。
序号
方法和描述
—
—
1
static InetAddress getByAddress(byte[] addr) 给出给定原始IP地址的InetAddress对象
2
static InetAddress getByAddress(String host, byte[] addr) 根据指定的地址返回InetAddress对象
3
static InetAddress getByName(String host) 确定主机名称的IP地址。
4
String getHostAddress() 以文本形式返回IP地址
5
String getHostName() 返回主机地址
6
static InetAddress InetAddress getLocalHost() 返回本地地址
7
String toString() 返回Ip的String
Socket编程例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // File Name GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } }
Socker 服务端例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; }catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.start(); }catch(IOException e) { e.printStackTrace(); } } }
输出 1 2 3 4 5 $ java GreetingClient localhost 6066 Connecting to localhost on port 6066 Just connected to localhost/127.0.0.1:6066 Server says Thank you for connecting to /127.0.0.1:6066 Goodbye!
原文