您的位置:首页 > 理论基础 > 计算机网络

黑马程序员_网络编程

2012-05-17 11:34 225 查看
----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

网络编程

1.网络模型

OSI参考模型

共七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

TCP\IP参考模型

共四层:应用层、传输层、网际层、主机至网络层

2.网络通信要素

IP地址

1.网络中设备的标识

2.不易记忆,可用主机名

3.本地回环地址:127.0.0.1 主机名:localhost

3.端口号

1.用于标识进程的逻辑地址,不同进程的标识

2.有效端口:0-65535,其中0~ 1024系统使用或保留端口。

4.传输协议

1.通信的规则

2.常见协议:TCP、UDP

UDP传输

1.DatagramSocket与DatagramPacket

2.建立发送端,接收端

3.建立数据包

4.调用Socket的发送接收方法

5.关闭Socket

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

TCP传输

1.Socket和ServerSocket

2.建立客服端与服务端

3.建立连接后,通过Socket中的io流进行数据的传输

4.关闭socket

同样,客户端与服务器端是两个独立的应用程序

一:ip地址的获取

1.获取本机的ip及主机名

InetAddress i=InetAddress.getLocalHost();

System.out.println(i.toString());

System.out.println("address:"+i.getHostAddress());

System.out.println("name:"+i.getHostName());

2.获取网站的ip地址

InetAddress ia=InetAddress.getByName("www.baidu.com");

System.out.println("address:"+ia.getHostAddress());

System.out.println("name:"+ia.getHostName());

三:通过udp传输方式,将一段文字数据发送出去

定义一个udp的发送端

思路:

1.建立updsocket服务

2.提供数据,并将数据封装到数据包中

3.通过socket服务的发送功能,将数据包发出去

4.关闭资源

eg:

public static void main(String[] args) throws Exception

{

//1.创建udp服务,通过DatagramSocket对象。

DatagramSocket ds=new DatagramSocket();

//2.确定数据,并封装成数据包

byte[]buf="udp ge men lai le".getBytes();

DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName ("192.168.1.101"),10000);

//3.通过socket服务将已有的数据包发送出去,通过send方法

ds.send(dp);

//4.关闭资源

ds.close();

}

四:定义一个应用程序,用于接收udp协议传输的数据并处理

定义一个udp的接收端

思路:

1.定义udpsocket服务。通常会监听一个端口,其实就是给这个接受网络应用程序定义数字标识。

方便于明确那些数据过来该应用程序可以处理

2.定义一个数据包,因为要存储接收到的字节数据,因为数据包中有更多功能可以提取字节数据中不同的信息

3.通过Socket服务的recerve方法将收到的数据存入到已定义的数据包中

4.通过数据包对象的特有功能。将这些不同的数据取出,打印到控制台上

5.关闭资源

eg:public static void main(String[] args) throws Exception

{

//1.创建udp的Socket服务,建立端点

DatagramSocket ds=new DatagramSocket(10000);

//2.定义数据包,用于存储数据

byte []buf=new byte[1024];

DatagramPacket dp=new DatagramPacket(buf,buf.length);

//3.通过服务的receive方法将收到数据存入数据包中

ds.receive(dp);

//4.通过数据包的方法获取其中的数据

String ip=dp.getAddress().getHostAddress();

String data=new String(dp.getData(),0,dp.getLength());

int port=dp.getPort();

System.out.println(ip+":"+data+"L"+port);

//5.关闭资源

ds.close();

}

五:编写一个聊天程序,有收数据的部分和发数据的部分,这两部分需要同时执行。就需要用到多线程技术

一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义两个Run方法

而且这两个方法要封装到不同的类

eg: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("886".equals(line))

break;

byte[]buf=line.getBytes();

DatagramPacket dp=new DatagramPacket (buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);

ds.send(dp);

}

}

catch (Exception e)

{

throw new RuntimeException("发送端失败");

}

}

public static void main(String[] args) throws Exception

{

DatagramSocket sendSocket=new DatagramSocket();

DatagramSocket receiveSocket=new DatagramSocket();

new Thread(new Send(sendSocket)).start();

new Thread(new Send(receiveSocket)).start();

}

六:TCP的传输

1.tcp分客户端与服务端

2.客户端对应的对象是Socket

服务端对应的对象是ServerSocket

客户端:

查阅socket对象,发现在该对象建立时,就可以去连接指定的主机

因为tcp是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道 进行数据的传输

eg:public static void main(String[] args) throws Exception

{

//创建客户端的socket服务、指定目的主机和端口

Socket s=new Socket("192.168.1.101",10003);

//为了发送数据,应该获取socket流中的输出流

OutputStream out=s.getOutputStream();

out.write("ecp ge men lai le".getBytes());

s.close();

}

服务器:

1.建立服务器的socket服务,ServerSocket();并监听一个端口

2.获取连接过来的客户端对象。

通过ServerSocket的accept方法,没有连接就会等,所以这个方法是阻塞式的

3.客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发 过来的数据,并打印在控制台

4.关闭服务器。(可选的)

eg:public static void main(String [] args) throws Exception

{

//建立服务端socket服务,并监听一个端口

ServerSocket ss=new ServerSocket(10003);

//通过accept方法获取连接过来的客户端对象

Socket s=ss.accept();

String ip=s.getInetAddress().getHostAddress();

System.out.println(ip+".....connection");

//获取客户端发送过来的数据,那么要是用客户端对象的读取流来读取对象

InputStream in=s.getInputStream();

byte[] buf=new byte[1024];

int len=in.read(buf);

System.out.println(new String(buf,0,len));

s.close();//关闭客户端

ss.close();//关闭服务器

}

七:建立一个文件转换服务器

客户端给服务器发送文本,服务器端会将文本转换为大写再返回给客户端,而且客户端可以不断的进行文 本转换,当客户端输入over时,转换结束

eg:public static void main(String[] args) throws Exception

{

Socket s=new Socket("192.168.1.101",10005);

//定义读取键盘数据的流对象

BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

//定义目的,将数据写入到socket输出流,发给服务端

// BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter (s.getOutputStream()));

PrintWriter out=new PrintWriter(s.getOutputStream(),true);

//定义一个socket读取流,读取服务端返回的大写信息

BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

String line=null;

while((line=bufr.readLine())!=null)

{

if ("over".equals(line))

break;

/*bufOut.write(line);

bufOut.newLine();

bufOut.flush();*/

out.println(line);

String str=bufIn.readLine();

System.out.println("server:"+str);

}

bufr.close();

s.close();

}

public static void main(String[] args) throws Exception

{

ServerSocket ss=new ServerSocket(10005);

Socket s=ss.accept();

String ip=s.getInetAddress().getHostAddress();

System.out.println(ip+"....connection");

//读取socket读取流中的数据

BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

//目的:socket输出流。将大写数据写入到socket输出流,并发送给客户端

//BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter (s.getOutputStream()));

PrintWriter out=new PrintWriter(s.getOutputStream(),true);

String line=null;

while((line=bufIn.readLine())!=null)

{

System.out.println(line);

out.println(line.toUpperCase());

/*bufOut.write(line.toUpperCase());

bufOut.newLine();

bufOut.flush();*/

}

s.close();

ss.close();

}

代码中BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter (s.getOutputStream()));

bufOut.write(line);

bufOut.newLine();

bufOut.flush();执行的功能和下面的代码效率等同

PrintWriter out=new PrintWriter(s.getOutputStream(),true);

out.println(line);

八:演示客户端与服务端

客户端:浏览器

服务端:自定义

eg:public static void main(String[] args) throws Exception

{

ServerSocket ss=new ServerSocket(11000);

Socket s=ss.accept();

System.out.println(s.getInetAddress().getHostAddress());

InputStream in=s.getInputStream();

byte[]buf=new byte[1024];

int len=in.read(buf);

System.out.println(new String(buf,0,len));

PrintWriter out=new PrintWriter(s.getOutputStream(),true);

out.println("<font color='red' size='5'>客户端你好</font>");

s.close();

ss.close();

}

九:URL类

String getFile()

获取此 URL 的文件名。

String getHost()

获取此 URL 的主机名(如果适用)。

String getPath()

获取此 URL 的路径部分。

int getPort()

获取此 URL 的端口号。

String getProtocol()

获取此 URL 的协议名称。

String getQuery()

获取此 URL 的查询部分。

eg:public static void main(String[] args) throws MalformedURLException

{

URL url=new URL("http://192.168.1.101:8080/MyWeb/demo.html");

System.out.println("getProtocol() :"+url.getProtocol());

System.out.println("getHost() :"+url.getHost());

System.out.println("getPort() :"+url.getPort());

System.out.println("getFile() :"+url.getFile());

System.out.println("getPath() :"+url.getPath());

System.out.println("getQuery() :"+url.getQuery());

}

class URLConnectionDemo

{

public static void main(String[] args) throws Exception

{

URL url=new URL("http://192.168.1.101:8080/MyWeb/demo.html");

URLConnection conn=url.openConnection();

System.out.println(conn);

InputStream in=conn.getInputStream();

byte[]buf=new byte[1024];

int len=in.read(buf);

System.out.println(new String(buf,0,len));

}

}

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: