借助代码的方式实现不同计算机(不同进程)之间的通讯称为网络编程。
核心要素:
(1)网络定位
IP + 端口 Port(唯一,一个进程对应一个端口号,1024-65535之间)
(2)通讯协议
TCP:传输控制协议
UDP:用户数据报协议
(3)基于TCP协议的网络编程
客户端:Socket client = new Socket(url,port);
服务端:ServerSocket server = new ServerSocket(port);
(4)实例一:发送字符与接收字符
/*====客户端====*/
Socket client = new Socket("localhost",8888);
//字节输出流
OutPutStream os = client.getOutPutStream();
//单位转换
OutPutStreamWriter osw = new OutPutStreamWriter(os);
//字符输出流
BufferedWriter bw = new BufferedWriter(osw);
//字符写出(发送字符)
bw.write("你好");
bw.newLine();
bw.flush();
//接收服务端发来的字符
InPutStream is = client.getInPutStream();
InputStreamReader isr = new InputStreamReader(isr);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
System.out.println("服务器说:"+ line);
//关闭IO流
br.close();
bw.close();
//关闭客户端
client.close()
/*====服务端====*/
ServerSocket server = new ServerSocket(8888);
System.out.println("等待请求...");
Socket client = server.accept();
System.out.println("请求到来:"+ client.getInetAddress() + client.getHostAddress());
//接收客户端发来的字符
InPutStream is = client.getInPutStream();
InPutStreamReader isr = new InPutStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str = br.readLine();
System.out.println(client.getInetAddress() + client.getHostAddress() + "说:" + str);
//发送字符给客户端
OutPutStream os = client.getOutPutStream();
OutPutStreamWriter osw = new OutPutStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("拜拜");
//关闭IO流
br.close();
bw.close();
//关闭Socket
client.close();
server.close();
(5)实例二:发送对象与接收对象
/*====定义Bean对象并实现Seralizable接口====*/
public class MgrBean implements Serializable{
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/*定义Package类用来打包对象进行传输*/
public class Package implements Serializable {
private String type;
private String dml;
private Object data;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDml() {
return dml;
}
public void setDml(String dml) {
this.dml = dml;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
/*====客户端====*/
Socket client = new Socket("localhost",6666);
OutPutStream os = client.getOutPutStream();
ObjectOutPutStream oos = new ObjectOutPutStream(os);
//新建对象并赋值
MgrBean mgr = new MgrBean();
mgr.setId(1);
mgr.setName("text");
//新建Package对象并将mgr进行打包
Package bag = new Package();
bag.setType("Mgr");
bag.setDml("saveMgr");
bag.setData(mgr);
//对象写出
oos.writeObject(bag);
oos.flush();
//关闭IO流和客户端
oos.close();
client.close();
/*====服务端(服务端的Bean要与客户端的相同)====*/
SocketServer server = new SocketServer(6666);
Socket client = server.accept();
InPutStream is = client.getInPutStream();
ObjectInPutStream ois = new ObjectInPutStream(is);
//先读取包裹
Package bag = (Package)ois.readObject();
String type = bag.getType();
String dml = bag.getDml();
Object data = bag.getData();
//根据包裹的数据判断Bean的类型与调用的方法
if(type.equal("Mgr")){
Mgr mgr = (Mgr)data;
if(dml.equal("saveMgr")){
dao.saveMgr(mgr);//调用Dao的方法将客户端传过来的数据存入数据库
}
}
//关闭IO流与Socket
ois.close();
client.close();
server.close();