在网络编程中,Socket是一种非常通用的方式。所谓socket通常被翻译成"套接字"。很晦涩。其实按我的理解所谓socket就是指两者之间通信的一个管道。
好比刚见面的两个人,一个人伸出手去,等待和你握手。这时候,先伸手的人就是服务器。后伸手的人就是客户端,但是一旦两人握上了手,那么都可以摇手表示你好你好啊。
又好比一部等待呼入的电话A。就可以看成一个服务器。来等待其它人的呼入。一旦你用话机拨打了A的号码。那么你的话机B就是客户端,A就是服务器啦。那么你们就通过电话线建立了一个通信的Socket了。
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
首先建立一个服务器端代码如下:
//服务器
public class Server0312 {
Socket socket=null; //套接字
InputStream is =null;//输入流
OutputStream os =null;//输出流
BufferedReader br =null;
public Server0312(){
try {
ServerSocket server =new ServerSocket(5005);
socket= server.accept();
System.out.println("服务已连接---");
is =socket.getInputStream();
os=socket.getOutputStream();
br=new BufferedReader(new InputStreamReader(is));
os.write("welcome".getBytes());//发送给客户端
os.flush();
String said=br.readLine();//可以一次读取一行,读取客户端发来的消息
System.out.println("client said:"+said);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server0312();
}
}
然后建立一个客户端代码:
public class Client0312 {
Socket socket=null; //套接字
InputStream is =null;//输入流
OutputStream os =null;//输出流
BufferedWriter bw=null;
public Client0312(){
try {
socket=new Socket("127.0.0.1",5005);//指定连接地址和端口
is =socket.getInputStream();
os=socket.getOutputStream();
bw=new BufferedWriter(new OutputStreamWriter(os));
byte[] b =new byte[1024];
int len=is.read(b);
String s =new String(b,0,len);
System.out.println("服务器说:"+s);
bw.write("hello");
bw.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
bw.close();
is.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client0312();
}
}
程序首先运行服务端,然后运行CLient程序,服务器首先说Welcome.客户端收到后说hello.
这是一个非常简单的c/s通讯模型。
如果服务器要一直运行并监听的话。服务器必须开启线程了。以下为SLideshare的ppt |