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();
}
}
}
注意这里应该关掉输出流,不然会造成客户端输出流没有关闭,而服务端则认为客户端没有关闭,出现客户端一直有输出流,而服务端则一直等待,从而造成死锁!