java网络编程笔记_java网络编程笔记

网络编程就是在两个或两个以上的设备之间传输数据

网络通讯两种方式:

1、TCP(传输控制协议)

使用这种方式进行网络通讯,需要建立专门的虚拟连接,然后

进行可靠的数据传输,如果数据发送失败,则客户端会自动

重发

2、UDP(用户数据报协议)

不需要建立专门的虚拟连接,传输也不是可靠。如果发送失败则客户端无法获得

TCP与UDP的区别

重要的数据一般用TCP方式进行数据传输

大量非核心的数据则通过UDP方式进行传递

由于TCP要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP的速度稍慢。而且传输时产生的数据量要比UDP稍微大

使用UDP,每个数据报都给出完整的地址信息,因此无需要建立发送方和接收方的连接

对于TCP,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然建立连接,在TCP中多了一个连接建立的时间

使用UDP传输数据时有大小限制,每个被传输的数据报须限定在64kb内

TCP没有大小限制,一旦连接建立 ,双方的socket就可以按统一的格式传输大量的数据

UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

TCP是一个可靠协议,它确保接收方完全正确地获取发送方所发送的全部数据

TCP在网络通信上有极强的生命 力。相比于UDP操作简单,仅需要较少的监护

基于URL的网络编程:

1创建一个URL 类URL

类URL提供的方法

getProtocol()//获取该URL的协议名

getHost()//获取该URL的主机名

getPort()//获取该URL的端口号

getFile()//获取该URL的文件名

getRef()//获取该URL在文件中的相对位置

getQuery()//获取该URL的查询信息

getPath()//获取该URL的路径

getAuthority()//获取该URL的权限信息

getUserInfo()//获得使用者信息

方法openStream()与指定的URL建立连接并返回InputStream类的对象

以从这一连接中读取数据

public static void main(String[] args) throws IOException {

URL url=new URL("http://www.baidu.com");

//使用openStream得到一输入流并由此构造一个BufferedReader对象

BufferedReader br=new BufferedReader(new InputStreamReader(

url.openStream()));

String line=null;

while((line=br.readLine())!=null){

System.out.println(line);

}

br.close();

}

网络编程都是由客户端和服务端组成

1、客户端网络编程

首先,

建立网络连接。需要指定连接到的服务器的IP地址和端口号,建立完成会形成

一条虚拟的连接。

再次,

交换数据。按照请求响应模型进行,由客户端发送一个请求数据到服务器,

服务器反馈一个响应数据给客户端。如果客户端不发送请求则服务器就不响应

然后,

关闭网络连接。释放程序占用的端口,内存等系统资源

2、服务器端网络编程

服务器端是指在网络编程中被动等待连接的程序。

首先,监听端口。监听本地计算机的某个固定端口,这个端口是服务器端开放给客户端的端口

服务器端程序运行的本地计算机的IP地址就是服务器端程序 的IP地址

再次,获得连接 当客户端连接到服务器端时,服务器端就可以获得一个连接

这个连接包含客户端的信息,如客户端IP地址等。可通过这个连接进行数据交换

一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接

都由独立的线程实现

然后,交换数据 服务器端的数据交换步骤是首先接收客户端发送过来 的数据,然后进行

逻辑处理,再把处理的结果数据发送给客户端。先接收再发送

最后 ,关闭连接

一个基础的网络类

InetAddress类

该类的功能 代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类内部

public static void main(String[] args) throws IOException {

InetAddress inet=InetAddress.getByName("www.163.com");

System.out.println(inet);//www.163.com/220.162.97.165

}

//使用IP地址创建对象

InetAddress inet=InetAddress.getByName("220.162.97.165");

//获取本机地址对象

public static void main(String[] args) throws IOException {

InetAddress inet=InetAddress.getLocalHost();

System.out.println(inet);//out:cx-st57/10.8.29.157

}

public static void main(String[] args) throws IOException {

InetAddress inet=InetAddress.getLocalHost();

String host=inet.getHostName();//获得对象存储的域名

String ip=inet.getHostAddress();//获得对象存储的IP

System.out.println(host);//out:cx-st57

System.out.println(ip);//out:10.8.29.157

}

TCP编程

java.net.Socket类代表客户端连接,以

java.net.ServerSocket类代表服务器端连接

客户端

首先,建立socket连接 Socket s=new Socket("www.sohu.com",80);

再次,按照请求响应模型进行网络数据交换

数据传输功能 由java IO实现 ,只需要 从连接中获得输入流和输出流,然后将需要 发送

的数据写入连接对象的输出流

OutputStream o=s.getOutputStream()

InputStream i=s.getInputStream()

最后,关闭网络连接

s.close()

服务器端

首先,监听端口

ServerSocket s=new ServerSocket(10000);

再次,获得连接

Socket socket=s.accept();实现 的功能是获得当前连接到服务器端的客户

端的连接。

accept和IO中的read方法是一个阻塞方法。就是当无连接时,该 方法会阻塞程序的执行,

直到连接到达时才执行该行代码。

然后,数据交换

InputStream is=socket.getInputStream();

OutputStream os=socket.getOutputStream()

最后

,关闭服务器端连接socket.close()

public class Test {

/**

* @param args

* @throws IOException

*/

public static void main(String[] args) throws IOException {

ServerSocket ss=null;

Socket socket=null;

OutputStream os=null;

InputStream is=null;

int port=10000;

try{

//监听端口

ss=new ServerSocket(port);

//获得连接

socket=ss.accept();

//接收客户端发送内容

is=socket.getInputStream();

byte[] b=new byte[1024];

int n=is.read(b);

//输出

System.out.println("client content:"+new String(b,0,n));

//向客户端发送反馈内容

os=socket.getOutputStream();

os.write(b,0,n);

}catch(Exception ex){

ex.printStackTrace();

}finally{

os.close();

is.close();

socket.close();

ss.close();

}

}

}

UDP编程

主要类:

1

DatagramSocket类。实现发送数据时的发射器以及接收数据时的监听器

2

DatagramPacket类。实现对于网络中传输的数据封装。

建立连接

DatagramSocket ds=new DatagramSocket();

该客户端连接使用系统随机分配 的一个本地计算机的未用端口号

或者

DatagramSocket ds=new DatagramSocket(5000);

发送数据

在发送数据时,需要 将需要发送的数据内容首先转换成byte数组,然后

装数据内容,服务器IP和服务器端口号一起构造 成一个DatagramPacket

类型的对象。发送时调用网络连接对象 的send方法发送

public static void main(String[] args) throws UnknownHostException, IOException {

String s="hello world";

String host="127.0.0.1";

DatagramSocket ds=new DatagramSocket();

int port=10000;

//将发送的内容转换成byte数组

byte[] b=s.getBytes();

//将服务器IP转换成I netAddress对象

InetAddress server=InetAddress.getLocalHost();

//构造发送的数据包对象

DatagramPacket sendDp=new DatagramPacket(b,b.length,server,port);

// 发送数据

ds.send(sendDp);

}

UDP客户端编程接收数据

首先,构造一个数据缓冲数组,用于存储接收的服务器端反馈数据,。

然后,以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象

的receive方法接收数据即可。

byte[] data=new byte[1024];

//构造数据包对象

DatagramPacket receiveDp=new DatagramPacket(data, data.length);

//接收数据

ds.receive(receiveDp);

//输出数据内容

byte[] bb=receiveDp.getData();//获得缓冲数组

int len=receiveDp.getLength();//获得有效数据长度

String ss=new String(bb,0,len);

System.out.println(ss); 最后,关闭连接 ds.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值