1.什么是Socket?
Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求和应答请求!,Socket支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含进行网络通信的所必须的五种信息:协议,本机IP,本地端口,远地主机IP,远地主机端口!
2.Socket通信模型
3.服务端的编写
package JayKing.WebDesign.Study; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; /** * 服务端实现类 * @author JayKing */ public class MyServer implements Server { String info; String[] sendinfo = { "你好", "早上好", "中午好", "good morning" }; @Override public void Response(Socket con) { try { OutputStream out = con.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); int ramdom = (int) (Math.random() * sendinfo.length); String time=new Date().toString(); bw.write(sendinfo[ramdom]+"\t"+time); bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void Request(Socket con) { try { InputStream in = con.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "gbk")); char buf[] = new char[1024]; while (br.read(buf) != -1) { info = new String(buf) + info; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void closeCon(Socket con) { try { con.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public Socket AcceptCon(int port) { Socket con = null;// socket是表示网络连接的对象 try { @SuppressWarnings("resource") ServerSocket serverSocket = new ServerSocket(port);// 绑定端口。 boolean flag = true; while (flag) { con = serverSocket.accept();// 等待连接 if (con != null) { Request(con); Response(con); closeCon(con); } } } catch (IOException e) { e.printStackTrace(); } return con; } public void tellEveryone(String info, Socket con) { try { OutputStream out = con.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); bw.write(info); bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4.客户端的编写
package JayKing.WebDesign.Study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
/**
* 客户端实现类
*
* @author JayKing
*
*/
public class ClientA implements Client {
@Override
public Socket doCon(String host, int port, String info) {
Socket con = null;
try {
con = new Socket(host, port);// 创建连接
Request(con, info);
con.shutdownOutput();// 不加则会出现死锁现象
Response(con);
} catch (IOException e) {
e.printStackTrace();
}
return con;
}
@Override
public void Response(Socket con) {
try {
InputStream in = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
char buf[] = new char[48];
System.out.print("服务端的信息:");
while (br.read(buf) != -1) {
System.out.print(new String(buf));
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void Request(Socket con, String info) {
try {
Writer writer = new OutputStreamWriter(con.getOutputStream());
writer.write(info);
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void close(Socket con) {
try {
con.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意这里应该关掉输出流,不然会造成客户端输出流没有关闭,而服务端则认为客户端没有关闭,出现客户端一直有输出流,而服务端则一直等待,从而造成死锁!