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

黑马程序员--网络编程

2015-12-09 21:56 531 查看
<span style="font-family:SimSun;font-size:14px;">
</span>------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一简介

1、网络模型 

(1)OSI参考模型 

(2)TCP/IP参考模型 

2、网络通讯要素 

1)IP地址(InetAddress已经封装成了对象) 

 1、网络中设备的标识

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

 3、本地IP地址:127.0.0.1 主机名:Localhost。

2)端口号(数字标识,没有必要封装成对象) 

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

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

3)传输协议

 1、通讯的规则。

 2、常见协议:TCP,UDP。

3、网络通讯过程 

(1)找到对方 IP。 

(2)数据要发到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行了标识。为了方便称呼这个数字,叫做端口。(逻辑端口) 
4了解:Ping 127.0.0.1(LocalHost)可以查看网卡是否异常。 由于IP地址是一个复杂的事物,Java已经它封装成了对象,封装成了对象把复杂的事情简单化。

4.InetAddress的常见方法 

InetAddress是用于封装ip地址的类,常见方法:

InetAddress:构造方法私有,不能直接创建对象。

InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。

InetAddress getLocalHost():返回本地主机。

InetAddress[] getAllByName(String host)

ip.getHostAddress(),获取地址

ip.getHostName()

举例:

<span style="font-family:SimSun;font-size:14px;">		InetAddress inet=InetAddress.getLocalHost();//返回本地主机。
String add1=inet.getHostAddress();//获取地址
String name1=inet.getHostName();
System.out.println(add1+"....//"+name1);
InetAddress i=InetAddress.getByName("192.168.1.3");//在给定主机名的情况下确定主机的ip地址。
System.out.println(i.getHostAddress());</span>

二UNP和TCP

一、UDP:

    1、将数据源和目的地封装到数据包中,不需要建立连接

    2、每个数据包的大小限制在64k以内

    3、因无连接,是不可靠协议

    4、不需要建立连接,速度快

例子:聊天、对讲机就是UDP的,面向无连接(不管在不在,知不知道,只管发送,求速度),丢数据也不管。速度快。数据被分成包

二、TCP:

1、建立连接,形成传输数据的通道

2、在连接中进行大量数据的传输

3、通过三次握手完成连接、是可靠协议

4、必须建立连接,效率会稍低

例子:电话通话,必须连接,对方同意才可以发送数据(不然就等待),不能丢失数据。
udp的发送端:

①建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分       配一个未被使用的端口。

②明确要发送的具体数据。

③数据封装成了数据包。

④用socket服务的send方法将数据包发送出去。

⑤关闭资源。
<span style="font-family:SimSun;font-size:14px;">DatagramSocket ds=new DatagramSocket(10001);
byte[] arr="wo lai le".getBytes();

DatagramPacket dp=new DatagramPacket(arr,arr.length,InetAddress.getByName("192.168.1.3"),10000);
ds.send(dp);
ds.close();</span>
udp的接收端:
①创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。

②定义数据包,用于存储接收到数据。

③通过socket服务的接收方法将收到的数据存储到数据包中。

④ 通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。

⑤关闭资源。

 
<span style="font-family:SimSun;font-size:14px;">DatagramSocket ds=new DatagramSocket(10000);
byte[] arr=new byte[1024];

DatagramPacket dp=new DatagramPacket(arr,arr.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port =dp.getPort();
System.out.println(ip+"..."+data+"///"+port);</span>


练习:编写一个聊天程序,收数据和发数据能同时进行;

<span style="font-family:SimSun;font-size:14px;">import java.net.*;
import java.io.*;
import java.util.*;
class DatagramSocketSystemin
{
public static void main(String[] args) throws Exception
{
DatagramSocket dssend=new DatagramSocket();
DatagramSocket dsrec=new DatagramSocket(10003);
new Thread(new DatagramSockets(dssend)).start();
new Thread(new DatagramSocketr(dsrec)).start();
}
}
class DatagramSockets implements Runnable
{
private DatagramSocket ds;
public DatagramSockets(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while ((line=br.readLine())!=null)
{
if ("886".equals(line))
break;
byte[] arr1=line.getBytes();
DatagramPacket dp=new DatagramPacket(arr1,arr1.length,InetAddress.getByName("192.168.1.255"),10003);
ds.send(dp);
}
}
catch (Exception ex)
{

}

}
}
class DatagramSocketr implements Runnable
{
private DatagramSocket ds;
public DatagramSocketr(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while (true )
{
byte[] arr=new byte[1024];
DatagramPacket dp=new DatagramPacket(arr,arr.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port =dp.getPort();
System.out.println(ip+".."+port+".//...."+data);
}

}
catch (Exception ec)
{
throw new RuntimeException("jie shou shi ban ");
}
}

}</span>Socket 客户端:

1,建立udp的socket服务。

DatagramSocket ds = newDatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。

 2,明确要发送的具体数据。

String text = "udp传输演示 哥们来了";

byte[] buf = text.getBytes();

3,将数据封装成了数据包。

DatagramPacket dp = newDatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);

4,用socket服务的send方法将数据包发送出去。

ds.send(dp);

5,关闭资源。

ds.close();

Socket服务端:
1,创建udp的socket服务。

DatagramSocket ds = newDatagramSocket(10000);//必须指定,并且和上面的端口号一样!

2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。

byte[] buf = new byte[1024];

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

3,通过socket服务的接收方法将收到的数据存储到数据包中。

ds.receive(dp);//该方法是阻塞式方法。

4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。

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

int port = dp.getPort();

String text = newString(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。

5,关闭资源。

ds.close();

练习:需求:建立一个文字转换服务器。

客户端给服务端发送文字,服务单会将文字转成大写在返回给客户端。

而且客户度可以不断的进行文字转换。当客户端输入over时,转换结束

<span style="font-family:SimSun;font-size:14px;">import java.io.*;
import java.net.*;
class SocketClient
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("192.168.1.3",10009);
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
BufferedReader bufr2=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;

while ((line=bufr.readLine())!=null)
{
if ("over".equals(line))
break;
pw.println(line);
//buwr.newLine();
//buwr.flush();
String str=bufr2.readLine();
System.out.println(str);
}
bufr.close();
s.close();
}
}
class SocketServer
{
public static void main(Stri
9d6b
ng[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10009);
Socket s1=ss.accept();
String ip=s1.getInetAddress().getHostAddress();
BufferedReader br=new BufferedReader(new InputStreamReader(s1.getInputStream()));
//BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s1.getOutputStream()));
PrintWriter pw=new PrintWriter(s1.getOutputStream(),true);
String line=null;
while ((line=br.readLine())!=null)
{
System.out.println(line);
//bw.write(line.toUpperCase());
//bw.newLine();
//bw.flush();
pw.println(line.toUpperCase());
}
s1.close();
ss.close();
}
}</span>

练习:将客户端的一个文本文件上传到服务端去.
<span style="font-family:SimSun;font-size:14px;">import java.io.*;
import java.net.*;
class SocketClinet1
{
public static void main(String[] args)
{
Socket s=new Socket("192.168.1.3",10010);
BufferedReader sb=new BufferedReader(new InputStreamReader(new FileInputStream("lianxi.java")));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

String line=null;
while ((line=sb.readLine())!=null)
{
pw.println(line);

}
BufferedReader sb1=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=sb1.readLine();
System.out.println(str);
s.close();
sb.close();
}
}
class SocketServer
{
public static void main(String[] args)
{
ServerSocket ss=new ServerSocket(10010);
Socket s=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream));
PrintWriter pw=new PrintWriter(new FileWriter("mm.txt").txt);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String str=null;
while ((line=br.readLine())!=null)
{
pw.println(line);

}
bw.write("收到了".getBytes());

}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: