黑马程序员之网络编程

来源:互联网 发布:淘宝宝贝无法购买 编辑:程序博客网 时间:2024/05/09 12:22
---------------------- android培训、java培训、期待与您交流! ----------------------

网络编程基础知识

网络协议:TCP /IP

IP地址和Port(端口号)

本地回路的IP地址:127.0.0.1

端口号的范围0~65535之间,0~1023之间的端口数是用于一些知名的网络服务和应用

UDP和TCP,传输控制协议(Transmission Control Protocol);是面向连接的通信协议。

UDP,用户数据报协议(User Datagram Protocol);是无连接通信协议;

TCP,UDP的数据帧格式图例:

协议类型,源IP,目标IP,源端口,目标端口,帧序号,帧数据

Socket是网络驱动层提供给应用程序编程的接口和一种机制。

可以把Socket比喻成是一个港口码头,应用成粗只要把货物放到港口码头上,就算完成了货物的运送。应用程序只需要等待货物到达码头后,将货物取走

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port

Socket数据发送过程:有应用程序产生Socket,然后应用程序调用bind方法把Socket信息通知给驱动程序,应用程序绑定Socket,应用程序向Socket发送数据,驱动程序从Socket中取出数据后,驱动程序从Socket中取出数据并通过网卡发送出去。数据发送工作有驱动程序完成,要讲数据分成小的数据段,打包成TCP和UDP的数据帧格式。

数据接收:应用程序产生Socket,调用bind将Socket的信息通知给驱动程序,绑定后,如果网卡中受到的包中有Socket绑定的IP然后就放到Socket中,应用程序从Socket中取走。

Java中的网络编程类:位于Java.net包中

DatagramSocket用于UDP通信

ServerSocket类用于TCP通信的服务器端(接收客户端连接的)

Socket类用于TCP通信的服务器和客户端(收发数据的);没有制定端口号,系统分配一个,没有制定IP,驱动程序选择任意一个IP地址,绑定网卡发送数据。

编写简单的UDP应用程序:public class UdpSend{

Public static void main(String[] args){

DatagramSocket ds=new DategramSocket();

String strInfo=”hellowww.it315.org”;

Ds.send(new DatagramPacket(”hellowww.it315.org”.getBytes(),”hellowww.it315.org”.length(),InetAddress.getByName(”192.168.0.1”),3000));

Ds.close();

}

}

public class UdpSend{

 

Public static void main(String[] args){

Byte[]buf = new byte[1024];

DatagramSocket ds=new DategramSocket(3000);

DatagramPacket dp=new DatagramPacket(buf,1024);

Ds.receive(dp);

System.out.println(new String(dp.getData(),0,dp.getLength()) +”from”+

Dp.getAddress().getHostAddress()+”:”+)

Ds.close();

}

}

必须先启动接收程序,然后在启动发送程序,对于含有中文字符的内容,一定要把字符转化为字节数组之后,再来处理,否则数据就会丢失。

结合GUI,多线程,UDP编写网络聊天程序:

1编写图形用户界面;

2编写网络消息发送功能;

3编写网络消息接收功能;

Class Chat extends Frame{

List lst=new List(6);列表框最多放六行,超出使用滚动条;

TextField tfIp=new TextField(15);

TextField tfIp=new TextField(20);

 Public Chat(){

This.add(lst,”Center”);

Panel p=new Panel();

This.add(p,”South”);

p.setLayout(new  BorderLayout());

p.add(tfIP,”west”);

p.add(tfData,”East”);

tfData.addActionListener(new ActionListener(){

public void actionPerformed(){

tfData.setText(“”);

}

});

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

dispose();

System.exit(0);

}

});

}

}利用UDP通讯的两个程序是平等的没有主从之分:两个程序是同一个程序的两个运行实例,

TCP网络程序工作原理:

两个通讯程序是有主从之分的:主机类似114查号台。客户机程序类似普通电话,现有查号台,现有一个总机,接近拨打进来的电话,分配到座机上,总机没有空闲的座机时,等待牌号;

1首先由TCP服务器程序创建一个ServerSocket类,然后调用Accept方法等待客户来连接;

2客户端程序创建一个Socket并请求与服务器建立连接;

3服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接;

4建立了连接的两个Socket在一个单独的线程上对话

5服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤2到步骤5的过程。

public Socket(String host,int port)根据指定的字符串类型的IP地址和端口号

getInputStream返回Socket的输入流对象:

getOutputStream返回Socket的输出流对象:

关键代码如下:

ServerSocket ss=new ServerSocket(8001);//监听

Socket s=ss.accept();//建立连接,返回专线连接的Socket;

InputStream ips=s.getInputStream();

OutputStream ops=s.getOutputStream();

Tcp服务器必须先启动运行,Tcp客户程序才能连接上服务器

使用windows提供的telnet程序测试服务器程序;

使用BufferedReader包装类,从网络输出流中一次读取一行文本

打开belnet的本地回显功能:telnet -- help -- set -- set bocal-echo -- quit ;

如何检测和解决端口冲突问题:使用netstat命令,查看当前正在被使用的Tcp端口

2.通过一个配置参数来指定Tcp服务程序所使用的端口号

3.将用户所制定的端口号保存到一个文件中,当服务器程序下次启动时直接从文件中读取那个端口号

 

在Tcp网络连接上传递对象:

objectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流

使用objectInputStream和ObjectOutputStream类来包装底层网络字节流,Tcp服务器和Tcp客户机就可以传递对象类型的数据

 

URL:Uniform Resource Locator统一资源定位符

URL由协议主机名端口号和资源名组成例如:http://www.it315.org.8080:/index.html

一个完整的请求消息:一个请求行,若干个消息头,有个空行(分割作用)实体内容

一个完整的响应消息:一个状态行,若干个消息头,空行,实体内容

消息头:用来描述消息的消息(元消息)

主要有:Connection:处理完本次请求后是否保持继续连接

Accept-Language用逗号分割多个国家语言

Content-Length;实体内容长度(字节数)

Range:只需返回文档中的部分内容与Content-Range(请求与相应)

URL类:中的方法:getProtocal()获得协议名

getHost()获得主机名

getPort()获得端口号

getFile()获得资源名

 

---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima