java网络编程
最近项目不是太忙就想起java的网络编程,在这里自己做了一些总结
关于网络编程里的TCP/IP ,UDP在这里就不详细说明了,关于这些说明网上很多说法!
TCP编程主要是通过Socket和ServerSocket实现通信的
服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
Socket和ServerSocket方法:
类 | 常用构造方法 | 构造方法解释 |
---|---|---|
Socket | Socket(InetAddress address, int port) | 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
ServerSocket | ServerSocket(int port) | 创建绑定到特定端口的服务器套接字。 |
客户端代码
public static void main(String[] args) {
// TODO Auto-generated method stub
Socket socket=null;
//客户端使用输出流,往服务端发送数据
OutputStream os=null;
try {
//127.0.0.1 本机IP 9393 自定义端口号
socket=new Socket("127.0.0.1",9393);
//通过Socket得到输出流的对象
os=socket.getOutputStream();
Scanner sc=new Scanner(System.in);
String str=sc.next();
os.write(str.getBytes());
// TODO 是告诉服务端客户端信息发送完成
socket.shutdownOutput();
//服务端返回的信息
InputStream is=socket.getInputStream();
byte[] by=new byte[1024];
int len=0;
//读取服务端返回的信息内容
while ((len=is.read(by))!=-1) {
System.out.println(new String(by,0,len));
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(os!=null){
os.close();
}
if(socket!=null){
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端代码
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
InputStream is = null;
OutputStream os = null;
try {
ss = new ServerSocket(9393);
//等待连接
s = ss.accept();
//回去输入流
is = s.getInputStream();
byte[] by = new byte[1024];
int len = 0;
//输出信息
while ((len = is.read(by)) != -1) {
System.out.println(new String(by, 0, len));
}
os = s.getOutputStream();
//收到客户端信息,返回给客户端的信息
os.write("收到你的情意".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(os!=null){
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(s!=null){
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ss!=null){
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
UDP编程主要是通过DatagramSocket和DatagramPacket实现通信的
DatagramSocket和DatagramPacket方法:
客/服 | DatagramSocket常用构造方法 | DatagramPacket常用构造方法 |
---|---|---|
客户端 | DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。 | DatagramPacket(byte[] buf, int offset, int length)构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。 |
服务端 | DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口。 | DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 |
客户端代码
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
DatagramSocket dSocket=new DatagramSocket();
byte[] by="你好我是UDP".getBytes();
//创建数据包 指定IP 和端口号
DatagramPacket dPacket=new DatagramPacket(by, 0, by.length,InetAddress.getByName("127.0.0.1"),9393);
//发送数据包
dSocket.send(dPacket);
dSocket.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
服务端代码
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//建立连接
DatagramSocket socket=new DatagramSocket(9393);
byte[] by=new byte[1024];
DatagramPacket packet=new DatagramPacket(by, 0, by.length);
//读取数据包
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}