------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、网络模型:
1、OSI和TCP/IP模型:
2、网络通讯要素:
IP地址:本地回环地址:127.0.0.1,主机名:localhost
端口号:有效端口:0-65535 0-1024为系统使用或保留端口(用于标识应用程序)
传输协议:常见协议:TCP, UDP
二、UDP和TCP1、UDP:将数据封装在数据包,不用建立连接
每个数据包限制在64k
不可靠协议(因为无连接)
不用建立连接,速度快
2、TCP:建立连接,形成传输的通道
进行大量数据传输
可靠协议
效率低
//获取本地主机ip地址对象
InetAddress ip = InetAddress.getLocalHost();
//获取其他主机ip
ip = InetAddress.getByName("zhuji"); //通过主机名获取
ip = InetAddress.getByName("192.16.56.2");
System.out.println(ip.getHostAddress()); //获取主机地址
System.out.println(ip.getHostName()); //获取主机名
三、socket :为网络服务提供的一个机制
通信两端都有socket
网络通信就是socket间通信
1、UDP传输:
发送数据
<span style="white-space:pre"> </span>//建立udp的socket服务
DatagramSocket ds = new DatagramSocket();
//将发送数据封装到数据包
String string = "信息";
byte[] buf = string.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("172.16.56.6"),10000);
//将数据包发送出去
ds.send(dp);
//关闭socket服务
ds.close();
接收数据:
<span style="white-space:pre"> </span>//建立udp socket连接
DatagramSocket ds = new DatagramSocket();
//建立数据包,用于接收数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//使用socket服务的receive,将数据存到数据包
ds.receive(dp);
//解析数据包数据
String ip =dp.getAddress().getHostAddress(); //ip
int port = dp.getPort(); //端口
String text = new String(dp.getData(),0,dp.getLength());
//关闭资源
ds.close();
2、TCP传输 Socket和ServerSocket
客户端-->服务端:
//创建socket客户端,明确目的地和要连接的主机
Socket sk = new Socket("172.16.56.5",1000);
//通过getOutputStream()和getInputStream()获取字节流
//获取输出流
OutputStream out = sk.getOutputStream();
//使用输出流,将数据写出
out.write("hehe".getBytes());
//关闭资源
sk.close();
服务端:
接收客户端发送的数据
//创建服务端socket对象,ServerSocket,服务端提供端口
ServerSocket ss = new ServerSocket(10000);
//获取客户端对象
Socket st= ss.accept();
//通过socket对象获取输入流,读取客户端数据
InputStream in = st.getInputStream();
byte[] buf = new byte[1024];
int len =0;
while ((len=in.read(buf))!=-1) {
String text = new String(buf,0,len);
System.out.println(text);
}
//获取ip地址
String ip = st.getInetAddress().getHostAddress();
//关闭客户端,关闭服务端
st.close();
ss.close();
3、服务端读取数据,并返回数据至客户端:
//1创建服务端对象。
ServerSocket ss = new ServerSocket(10002);
//2,获取连接过来的客户端对象。
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
//3,通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
//使用客户端socket对象的输出流给客户端返回数据
OutputStream out = s.getOutputStream();
out.write("收到".getBytes());
s.close();创建英文大写转换服务器
ss.close();
4、练习:创建英文大写转换服务器
<span style="white-space:pre"> </span>//创建socket客户端对象
Socket sk = new Socket("172.15.65.3",10000);
//获取键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
//目的 socket输出流
PrintWriter out = new PrintWriter(sk.getOutputStream(),true);
//读取服务端返回的大写数据
BufferedReader bufr = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String line = null;
while ((line =br.readLine())!=null) {
if("over".equals(line)){
break;
}
out.print(line);
//读取服务端发回的数据
String up1=bufr.readLine();
System.out.println(up1);
}
sk.close();
<span style="white-space:pre"> </span>ServerSocket ss = new ServerSocket(10000);
//获取socket对象
Socket st= ss.accept();
String ipString =st.getInetAddress().getHostAddress();
//读取客户端发过来的数据,显示在控制台
BufferedReader br = new BufferedReader(new InputStreamReader(st.getInputStream()));
//获取输出流
PrintWriter pw = new PrintWriter(st.getOutputStream());
//转换成大写发给客户端
String line =null;
while ((line =br.readLine())!=null) {
System.out.println(line);
pw.write(line.toUpperCase());
}
st.close();
ss.close();