网络编程:
网络编程有两种实现方式:即通过
TCP协议和
UDP协议。
UDP:
属于不可靠的连接,发送数据包之前不会建立连接,不会保证数据报到没到达目的地。1,面向无连接
2,数据会被封包,包体积有限制64K
3,不可靠
4,速度快
聊天,视频会议,桌面共享都可以作为UDP传输;
TCP:
属于可靠的连接,在发送数据报之前建立连接,采用三次握手原则,可以保证数据能够完整的传输到目的地,因而传输速度也会比较慢。
1、建立连接,形成传输数据的通道
2、在连接中进行大数据量传输
3、通过三次握手完成连接,是可靠协议
4、必须建立连接,效率会稍低
1、建立连接,形成传输数据的通道
2、在连接中进行大数据量传输
3、通过三次握手完成连接,是可靠协议
4、必须建立连接,效率会稍低
Socket:
网络通信其实就是Socket间传输;
UDP传输:
DatagramSocket 与DatagramPacket
DatagramSocket建立发送端和接收端的Socket;send(dp)和receive(dp)方法实现对数据的发送和接收;
DatagramPacket封装面向无连接的UDP数据包,构造函数:DatagramPacket(byte[] buf,int length,InetAddress address,int port)等;
udp的发送端:
1:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。2:明确要发送的具体数据。
3:将数据封装成了数据包。
4:用socket服务的send方法将数据包发送出去。
5:关闭资源。
udp的接收端:
1:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。2:定义数据包,用于存储接收到数据。
3:通过socket服务的接收方法将收到的数据存储到数据包中。
4:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
5:关闭资源。
/*
编写一个聊天程序
右手数据的部分和发数据的部分
需要多线程同时执行
一个线程控制接受,一个线程控制发送;
*/
import java.net.*;
import java.io.*;
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = bufr.readLine())!=null) {
if (line.equals("youxiang")) {
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),2000);
ds.send(dp);
}
ds.close();
}catch(Exception e){
System.out.println("发送失败");
}
}
}
class Rece implements Runnable
{
private DatagramSocket ds;
public Rece (DatagramSocket ds){
this.ds = ds;
}
public void run ()
{
try{
byte [] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String (dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}catch(Exception e){
System.out.println("接受失败");
}
}
}
class ChatDemo{
public static void main(String[] args) throws Exception{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(2000);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
TCP传输:
Socket与ServerSocket
Socket:建立客户端,
new Socket(地址,端口);
SeverSocket:建立服务器端,
newSeverSocket(端口)
TCP客户端:
1:建立tcp的socket服务,最好明确具体的地址和端口。
2:连接成功后,产生socket流。通过getInputStream和getOutputStream获取socket流中的读取流和写入流。
2:连接成功后,产生socket流。通过getInputStream和getOutputStream获取socket流中的读取流和写入流。
3:添加数据。
4:关闭资源。
class TcpClient2
{
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",4000);
OutputStream out = s.getOutputStream();
out.write("hello Server".getBytes());
InputStream in = s.getInputStream();
byte [] buf = new byte[1024];
int len = in.read(buf);
String data= new String(buf,0,len);
System.out.println(data);
s.close();
}
}
TCP服务端:
1:创建服务端socket服务,并监听一个端口。
2:服务端通过accept()方法获取连接过来的客户端对象。
3:通过获取到的socket对象中的socket流和具体的客户端进行通讯。
4:关闭资源。
2:服务端通过accept()方法获取连接过来的客户端对象。
3:通过获取到的socket对象中的socket流和具体的客户端进行通讯。
4:关闭资源。
注意:要先关客户端,再关服务端。
class TcpServer2
{
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(4000);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String data= new String (buf,0,len);
System.out.println(ip+":"+data);
OutputStream out = s.getOutputStream();
out.write("hello client".getBytes());
}
}
URL封装和URLConection封装:
URL代表一个统一资源定位符,它是指向互联网“资源”的指针,资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用
例如:对数据库或搜索引擎的查询。
例如:对数据库或搜索引擎的查询。
String getFile():获取此URL的文件名
String getHost():获取此URL的主机名(如果适用)
String getPath():获取此URL的路径部分
int getPort(): 获取此URL的端口号
String getProtocol():获取此URL的协议名称
String getQuery():获取此URL的查询部
class URLConnectionDemo
{
public static void main(String[] args)throws Exception {
URL url=new URL("http://www.baidu.com");
URLConnection conn=url.openConnection();
InputStream in=conn.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
}
}