------- android培训、java培训、期待与您交流! ----------
Java网络编程
Java中基于套接字的通信,它使程序能将网络操作看成文件I/O——程序能够读取套接字,也能够写入套接字,就如同读写文件那样简单。套接字就是一种软件架构,表示连接的一端。套接字包括流套接字和数据包套接字。
利用流套接字,一个进程就能够与另一个进程建立连接。当建立好了连接时,进程间的数据流动就是连续的流。流套接字被认为是提供面向连接的服务,用来进行传输的协议是流行的TCP协议。
利用数据报套接字,传输的是单个信息包(最大64k)。对多数程序员而言,不适合使用数据报套接字,因为它使用的协议是UDP是面向无连接服务,所以无法保证包会以任何特定的顺序到达。使用UDP,甚至可能丢失包或重复接收到包。如果选择UDP的话,要通过大量的额外编程来解决这些问题。对于不要求进行错误检查和依赖于TCP的网络程序而言,UDP是合适的。
与面向连接的服务相比,无连接服务通常能提供更好的性能,但可靠性不佳。
TCP就好像现实中的电话通信,UDP就好像现实中的邮局通信。
用流套接字建立简单的服务器:
<1>第1步是创建一个ServerSocket对象。
ServerSocket server = new ServerSocket( portNumber );
会注册一个可用的TCP端口号,端口号由客户端使用,用于定位服务器计算机上的服务器程序。它经常被称为"握手点"。
<2>第2步是服务器通过连接过来的Socket对象管理每个客户端的连接。
Socket connection = server.accept();
当建立了与客户端的连接时,它会返回一个Socket。这个Socket使得服务器能够与客户端进行交互。
<3>第3步是获得Socket的InputStream和OutputStream对象,通过发送和接收字节使服务器能够与客户端通信。
<4>第4步是当传输完成时,服务器对Socket调用close方法,关闭连接。
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer2
{
public static void main(String[] args)throws Exception
{
ServerSocket ss = new ServerSocket(10004);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "...connected");
InputStream in = s.getInputStream();
byte[] buffer = new byte[1024];
int length = in.read(buffer);
System.out.println(new String(buffer, 0, length));
OutputStream out = s.getOutputStream();
// Thread.sleep(5000);
out.write("客户端你好,服务端收到".getBytes());
s.close();
ss.close();
}
}
用流套接字建立简单的客户端:
<1>第1步是创建一个连接到服务器的Socket。
Socket connection = new Socket( serverAddress, port );
<2>第2步是通过Socket获得InputStream和OutputStream对象,服务器和客户端通过它们进行通信。
<3>第3步当传输完成时,客户端对Socket对用close方法,关闭连接。客户端必须判断服务器何时完成了信息发送,以便能调用close方法来关闭Socket连接。例如:当InputStream的方法read检测到流结束符(也称为EOF,即文件结束符)时,会返回-1。
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient2
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("localhost", 10004);
OutputStream out = s.getOutputStream();
out.write("服务端,你好".getBytes());
InputStream in = s.getInputStream();
byte[] buffer = new byte[1024];
int length = in.read(buffer);
System.out.println(new String(buffer, 0, length));
s.close();
}
}
数据报套接字例程:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(9999);
byte[] data = "服务器你好".getBytes();
DatagramPacket dp =
new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 10000);
ds.send(dp);
ds.close();
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(10000);
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println("ip: " + ip);
System.out.println("data: " + data);
System.out.println("port: " + port);
}
//ds.close();
}
}