我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP和UDP/TP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
1.基于UDP/IP的socket编程
- /**
- *UDPServer
- *@author Winty wintys@gmail.com
- *@version 2008-12-15
- */
- import java.io.*;
- import java.net.*;
- class UDPServer{
- public static void main(String[] args)throws IOException{
- DatagramSocket server = new DatagramSocket(5050);
- byte[] recvBuf = new byte[100];
- DatagramPacket recvPacket
- = new DatagramPacket(recvBuf , recvBuf.length);
- server.receive(recvPacket);
- String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
- System.out.println("Hello World!" + recvStr);
- int port = recvPacket.getPort();
- InetAddress addr = recvPacket.getAddress();
- String sendStr = "Hello ! I'm Server";
- byte[] sendBuf;
- sendBuf = sendStr.getBytes();
- DatagramPacket sendPacket
- = new DatagramPacket(sendBuf , sendBuf.length , addr , port );
- server.send(sendPacket);
- server.close();
- }
- }
- /**
- *UDPClient
- *@author Winty wintys@gmail.com
- *@version 2008-12-15
- */
- import java.io.*;
- import java.net.*;
- class UDPClient{
- public static void main(String[] args)throws IOException{
- DatagramSocket client = new DatagramSocket();
- String sendStr = "Hello! I'm Client";
- byte[] sendBuf;
- sendBuf = sendStr.getBytes();
- InetAddress addr = InetAddress.getByName("127.0.0.1");
- int port = 5050;
- DatagramPacket sendPacket
- = new DatagramPacket(sendBuf ,sendBuf.length , addr , port);
- client.send(sendPacket);
- byte[] recvBuf = new byte[100];
- DatagramPacket recvPacket
- = new DatagramPacket(recvBuf , recvBuf.length);
- client.receive(recvPacket);
- String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
- System.out.println("收到:" + recvStr);
- client.close();
- }
- }
2.基于TCP/IP的socket编程
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
// 设置端口号
public static int portNo = 8082;
public static void main(String[] args) throws IOException {
//1.创建socket服务端对象
ServerSocket s = new ServerSocket(portNo);
System.out.println("The Server is start: " + s);
// 2.阻塞,直到有客户端连接
Socket socket = s.accept();
try {
System.out.println("Accept the Client: " + socket);
//设置IO句柄
//3.获取输入流准备取客户端发送的数据
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
while (true) {
String str = in.readLine();
if (str.equals("byebye")) {
break;
}
System.out.println("In Server reveived the info: " + str);
//Writer向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。
//它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入
//PrintWriter(OutputStream out) 根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
//PrintWriter(Writer out) 创建不带自动行刷新的新 PrintWriter。
//这两种构造方法。由于PrintWriter能够实现自动刷新所以又衍生出另两种:
//PrintWriter(OutputStream out, boolean autoFlush)
//通过现有的 OutputStream 创建新的 PrintWriter。
//PrintWriter(Writer out, boolean autoFlush) 创建新 PrintWriter
//http://blog.csdn.net/zsw2zkl/article/details/7209734
//4.接受客户端数据和写数据
out.println(str);
}
} finally {
System.out.println("close the Server socket and the io.");
//5.释放资源
socket.close();
s.close();
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class SocketClient {
static String clientName = "Mike";
//端口号
public static int portNo = 8082;
public static void main(String[] args) throws IOException {
// 设置连接地址类,连接本地
InetAddress addr = InetAddress.getByName("localhost");
//1.创建客户端,绑定端口,IP
Socket socket = new Socket(addr, portNo);
try {
System.out.println("socket = " + socket);
//2.将服务端的数据打印出来 设置IO句柄
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//3.向服务端发送数据
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println("Hello Server,I am " + clientName);
String str = in.readLine();
System.out.println(str);
out.println("byebye");
} finally {
System.out.println("close the Client socket and the io.");
//4.释放资源
socket.close();
}
}
}