点击打开链接 点击打开链接 点击打开链接 android培训、<a">点击打开链接 点击打开链接 java培训、期待与您交流!">点击打开链接 点击打开链接
网络编程
网络模型
l OSI参考模型
l TCP/IP参考模型
网络通讯要素
l IP地址:网络中设备的标识,不易记忆,可用主机名,本地回环地址,127.0.0.1 主机名:localhost
l 端口号:用于标识进程的逻辑地址,不同进程的标识,有效端口:0~65535,其中0~1024系统使用或保留端口
l 传输协议:通讯的规则,常见协议:TCP、UDP
网络通讯的一般过程
1.找到对方IP
2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这个数字,叫做 端口,逻辑端口。0~65535
3.定义一个通信规则。这个通讯规则成为协议。国际组织定义了通用协议TCP/IP通信。UDP
InetAddress类:此类表示互联网协议(IP)地址
static InetAddress | getLocalHost():获取本地主机
String | getHostAddress():返回IP地址字符串
String | getHostName():获取此IP地址的主机名
static InetAdress | getByAddress(byte[] addr):再给定原始IP地址的情况下,返回InetAddress对象
Static InetAddress | getByAddress(String host,byte[] addr):根据给定主机和IP地址创建InetAddress。
Static InetAddress | getByName(String host)在给定主机的情况下确定主机的IP地址。
static InetAddress[] | getAllBynames(String host):在给定主机名的情况下,根据系统上配置的名称服务返回其所组成的数组。
TCP和UDP
UDP:聊天,视频会议
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小限制在64K内
因无连接,是不可靠协议
不需要建立连接,速度快
TCP:下载
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
UDP传输
DatagramSocket类:此类表示用来发送和接收数据报包的套接字。
构造函数:DatagramSocket(int port):指定端口
DatagramSocket():
重要方法:
void | send(DatagramPacket p):发送数据报包
void | receive(DatagramPacket p) :接收数据报包
DatagramPacket 类:此类表示数据报包。
构造函数:
DatagramPacket(byte[] buf,int length)
DatagramPacket(byte[] buf,int length,InetAddress address,int port)
重要方法:
InetAddress | getAddress():返回此数据报将要发往该主机或者从该机器接收到的IP地址。
byte[] | getData():返回缓冲区数据
int | getLength():返回将要发生或接收到的数据的长度
int | getPort():获取此数据报将要发送往该主机或从该主机接收到的端口
通过UDP传输方式,将一段文字数据发送出去。
1.建立updSocket服务
2.提供数据,并将数据封装到数据包中
3.通过socket服务的发送功能,将数据包发送出去
4.关闭资源
定义一个应用程序,用于接收UDP传输的数据并处理
1.定义udpSocket服务,通常会接收一个端口,其实就是给这个网络应用程序定义数字标识,方便于明确哪些数据过来该应用程序可以处理。
2.定义一个数据包,因为要存储接收到的数据,数据包对象中有更多功能可以提前字节数据中的不同数据信息。
3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4.通过数据包特有的功能,将这些不同的数据取出,打印在控制台上
5.关闭资源
UDP练习:
import java.util.*; import java.io.*; import java.net.*; class UDP3 { public static void main(String[] args) { new Thread(new UDPSend3()).start(); new Thread(new UDPReceive3()).start(); } } class UDPSend3 implements Runnable { public void run() { try { DatagramSocket ds=new DatagramSocket(); //建立一个IO流接收数据 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); for(String str=br.readLine();str!=null;str=br.readLine()) { byte[] buf=str.getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),1002); ds.send(dp); if("over".equals(str)) break; } ds.close(); } catch (Exception e) { System.out.println(e); } } } class UDPReceive3 implements Runnable { public void run() { try { DatagramSocket ds=new DatagramSocket(1002); while(true) { byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); ds.receive(dp); String info=new String(buf,0,dp.getLength()); System.out.println(dp.getAddress()+"::"+info); if("over".equals(info)) break; } ds.close(); } catch (Exception e) { System.out.println(e); } } }
TCP传输
Socket和ServerSocket
l 建立客户端和服务器端
l 建立连接后,通过Socket中的IO流进行数据的传输
l 关闭Socket
l 同样,客户端和服务器端是两个独立的应用程序。
Socket类:此类实现客服端套接字
常用构造函数:Socket() Socket(InetAddress address,int port) Socket()
常用方法:
Void | close():关闭此套接字
Void | connect(SocketAddress endpoint):将此套接字连接到服务器。
InetAdddress | getInetAddress():返回此套接字连接的地址
InputStream | getInputStream():返回此套接字的输入流
OutputStream | getOutputStream():返回此套接字的输出流
Int | getPort():返回此套接字连接到的远程端口
Void | shutdownInput():此套接字的输入流置于“流的末尾”。
Void | shutdowmOutput():禁用此套接字的输出流。
ServerSocke此类实现服务器套接字
常用构造函数:ServerSocket() ServerSocket(int port)
常用方法:
Socket | accept():侦听并接受到此套接字的连接
URL类:代表一个统一资源定位符,它是指向互联网“资源”的指针。
URL(String spec)
重要方法:
String | getFile():获取此URL的文件名
String | getHost():获取此URL的主机名
String | getPath():获取此URL的路径部分
String | getProtocol():获取此URL的协议名称
String | getQuery():获取此URL的查询部分
URLConnection | openConnection():返回一个表示到URL所引用的远程对象的连接。
InputStream | openStream():打开到此URL的连接并返回一个用于从该连接读入的InputStream。
URLConnection类:抽象类,代表应用程序和URL之间的通信连接。
重要方法:
InputStream | getInputStream():返回从此打开的连接读取的输入流
OutputStream | getOutputStream():返回写入到此链接的输入流。
客户端
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机,因为TCP是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。
步骤:
1.创建socket服务,并指定要连接的主机和端口。
Socket(String host,int port);
2.为了发送数据,应该获取socket流中的输出流
getOutputStream()
Write()
3.关闭服务
服务端
1.建立服务端的socket服务,ServerSocket。
ServerSocket(int port)接听一个端口
2.获取连接过来的客服端对象。
通过accept()方法,获取Socket,没有连接就会等,所以这个方法是阻塞式的
3.客服端如果发送过来数据,那么服务端使用对应的客服端对象,并获取到该客服端对象的读取流来读取发过来的数据,并打印在控制台。
4.关闭服务端(可选)
//TCP终极练习 import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class TCP { private Frame f; private TextField tf; private Button bt; private TextArea ta; TCP() { init(); } public void init() { f=new Frame("我的浏览器"); f.setBounds(100,100,600,600); f.setLayout(new FlowLayout()); tf=new TextField(60); bt=new Button("转到"); ta=new TextArea(30,66); f.add(tf); f.add(bt); f.add(ta); myEvent(); f.setVisible(true); } public void myEvent() { bt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { ta.setText(""); String ip=tf.getText(); URL url=new URL(ip); URLConnection uc=url.openConnection(); InputStream In = uc.getInputStream(); byte[] buf=new byte[1024]; int len=0; while((len=In.read(buf,0,buf.length))!=-1) { ta.append(new String(buf,0,len)); } } catch (Exception ee) { throw new RuntimeException("登陆服务器失败!"); } } }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new TCP(); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。