网络编程

来源:互联网 发布:数独软件 编辑:程序博客网 时间:2024/06/02 17:06
1、 网络编程的三要素:IP地址:InetAddress、端口号、传输协议

要实现网络通讯:
1. 找到对方 IP
2. 数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,叫做端口。指的是逻辑端口
3. 定义通讯规则,这个规则称为协议。

国际组织了通用协议TCP/IP。

2、 IP地址:InetAddress
四段组成,每一段都是一个字节,一个字节取值范围0~255
新段地址IP/V6,6段组成
本地回环地址:127.0.0.1 主机名:localhost

3、 端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口
常见端口:Web服务:80、 Tomcat:8080、 mySQL:3306


4、 网络模型两种:
1. OSI OpenSystem Interconnection 开放系统互联参考模型
2. TCP/IP参考模型
3、 常见协议:UDP、TCP

a. UDP特点:面向无连接
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
b. TCP特点:面向谅解可靠的,建立连接传输大量数据
建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低

5、 InetAddress:表示互联网协议的IP地址

<span style="font-size:18px;">//演示获取IP实例public class IPDemo {public static void main(String[] args) throws IOException {//获取本机地址InetAddress ip=InetAddress.getLocalHost();//打印地址System.out.println(ip);//ThinkPad/169.254.124.183//获取地址System.out.println("address:"+ip.getHostAddress());//address:169.254.124.183//获取主机名System.out.println("name:"+ip.getHostName());//name:ThinkPad//获取任意一台主机地址InetAddress ia=InetAddress.getByName("169.254.124.183");System.out.println("ia:"+ia.getHostAddress());//ia:169.254.124.183System.out.println("ia:"+ia.getHostName());//ia:ThinkPad}}</span>
6、 Socket:网络编程指的就是Socket编程
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。

7、 UDP传输
DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。

发送端与接收端是两个独立的运行程序。

a. 在发送端,要在数据包对象中明确目的地IP及端口。

DatagramSocket ds = new DatagramSocket();
byte[] by = “hello,udp”.getBytes();
DatagramPacket dp = new DatagramPacket(by,0,by.length,
InetAddress.getByName(“127.0.0.1”),10000);
ds.send(dp);
ds.close();
<span style="font-size:18px;">演示实例:public class UDPDemo {public static void main(String[] args) throws IOException {// 创建udp服务,通过DatagramSocket()对象。DatagramSocket ds = new DatagramSocket();// 确定数据,并封装成数据包。byte[] buf = "udp ge men lai le !".getBytes();DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"), 10000);// 通过socket服务,将已有的数据包发送出去,通过send方法。ds.send(dp);// 关闭资源ds.close();}}</span>
b. 在接收端,要指定监听的端口。

DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();
<span style="font-size:18px;">演示实例:public class UDPServerDemo {public static void main(String[] args) throws IOException {// 创建udp Socket,建立连接DatagramSocket ds = new DatagramSocket(10000);// 定义数据包,用于存储数据byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length);// 通过服务的receive方法将接收到的数据存入到数据包中ds.receive(dp);// 通过数据包的方法获取其中的数据String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(), 0, dp.getLength());int port = dp.getPort();System.out.println(ip + "::" + data + "::" + port);//关闭资源ds.close();}}</span>
8、 TCP传输:
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务器端是两个独立的应用程序。

客户端基本思路:
a. 客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
b. 连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。
c. 与服务端通讯结束后,关闭Socket。

通过Socket建立对象并指定要连接的服务端主机以及端口。
Socket s = new Socket(“192.168.1.1”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();
<span style="font-size:18px;">客户端演示:public class ClientDemo {public static void main(String[] args) throws IOException, IOException {//创建客户端的Socket服务,指定目的的主机和端口Socket s=new Socket("127.0.0.1",100001);//为了发送数据,应该获取socket流中的输出流OutputStream out =s.getOutputStream();out.write("TCP哥们来了".getBytes());//关闭资源s.close();}}</span>
服务端基本思路:
a. 服务端需要明确它要处理的数据是从哪个端口进入的。
b. 当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
c. 当该客户端访问结束,关闭该客户端。

建立服务端需要监听一个端口
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();
服务端演示:

Tcp传输最容易出现的问题:
客户端连接上服务端,两端都在等待,没有任何数据传输。
通过例程分析:
因为read方法或者readLine方法是阻塞式。
解决办法:
自定义结束标记
使用shutdownInput,shutdownOutput方法。

9、常见的客户端和服务端

客户端:浏览器、QQ ...

服务端:Tomcat ...

http 超文本传输协议

10、URL对象,把地址封装成对象,便于对地址操作
urlConnection 安卓开发方面用的比较多
<span style="font-size:18px;">public class URLDemo {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://127.0.0.1:8080/myweb/demo.html?name=li&age=23");System.out.println(url.getProtocol());// httpSystem.out.println(url.getHost());// 127.0.0.1System.out.println(url.getPort());// 8080System.out.println(url.getPath());// /myweb/demo.htmlSystem.out.println(url.getFile());// /myweb/demo.html?name=li&age=23System.out.println(url.getQuery());// name=li&age=23URLConnection conn=url.openConnection();System.out.println(conn);//sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:8080/myweb/demo.html?name=li&age=23InputStream in=conn.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));}}</span>
11、 http://192.168.1.254:8080/myweb/demo.html
www.baidu.com想要将主机名翻译成ip地址,需要域名解析。DNS
域名解析服务器:里面记录的是主机名与ip地址的映射关系。

http://127.0.0.1:8080
http://localhost:8080
其实127和localhost的映射关系就在本机上。
C:\Windows\System32\drivers\etc\host

12、CS client server
特点:
1. 客户端和服务端都需要开发
2. 后期维护较为麻烦
3. 将服务端的部分运算转到了客户端。

13、BS Browser Server
特点:
1. 程序员只需要编写服务端
2. 对客户端的维护很容易。客户端什么都不需要装,只需要有浏览器即可。
3.所有的运算都在服务端,压力较大。

0 0