黑马程序员--网络编程
2015-12-09 21:56
531 查看
<span style="font-family:SimSun;font-size:14px;">
</span>------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
(2)TCP/IP参考模型
1、网络中设备的标识
2、不易记忆,可用主机名
3、本地IP地址:127.0.0.1 主机名:Localhost。
2)端口号(数字标识,没有必要封装成对象)
1、用于标识进程的逻辑地址,不同进程的标识。
2、有效端口:0~65535,其中0~1024系统使用或保留端口。
3)传输协议
1、通讯的规则。
2、常见协议:TCP,UDP。
(2)数据要发到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行了标识。为了方便称呼这个数字,叫做端口。(逻辑端口)
4了解:Ping 127.0.0.1(LocalHost)可以查看网卡是否异常。 由于IP地址是一个复杂的事物,Java已经它封装成了对象,封装成了对象把复杂的事情简单化。
InetAddress:构造方法私有,不能直接创建对象。
InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。
InetAddress getLocalHost():返回本地主机。
InetAddress[] getAllByName(String host)
ip.getHostAddress(),获取地址
ip.getHostName()
举例:
2、每个数据包的大小限制在64k以内
3、因无连接,是不可靠协议
4、不需要建立连接,速度快
例子:聊天、对讲机就是UDP的,面向无连接(不管在不在,知不知道,只管发送,求速度),丢数据也不管。速度快。数据被分成包
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;">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>
</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>
相关文章推荐
- linux系统重启网络delaying initialization错误的解决方法
- 网络层—IP多播
- 【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例
- linux下tcpdump详解
- CentOS---网络配置详解
- 关于基于复杂网络的数据挖掘的学习笔记
- 跨平台c++/boost/asio 简单的HTTP POST请求 客户端模型
- ASP.NET5 MVC6 利用Middleware 创建可访问HttpContext 的业务类工厂。(代替HttpContext.Current)
- Volley框架之四 加载网络图片
- 1491: [NOI2007]社交网络
- HTTP 错误 404.3 -Not Found---如何从报错的提示内容来寻找最佳解决方案?
- TCP/IP-协议族----17、应用层简单
- 【iOS】MD5数据加密和网络安全
- Xcode7 —https适配问题
- 网络层—路由器的构成
- 深入理解计算机系统中网络编程一节echo客户端服务器的源码编译和运行
- iis7 发布mvc 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容
- Linux下网络IP地址的转换函数
- http协议head详解
- python发送http multipart报文并和php交互