<a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!
网络编程
网络模型
OSI参考模型
TCP/IP协议
网络通信要素
IP地址
网络中设备的标识
不易记忆可用主机名
本地回环地址:127.0.0.1 主机名localhost
端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0-65535,其中0-1024系统使用和保留端口.
传输协议
通信规则,常见协议TCP,UDP
UDP和TCP
UDP将数据及源和目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,因为无连接,是不可靠协议.不需要建立连接速度快
TCP建立连接形成数据传输的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率会稍低
Socket就是为网络提供的一种机制.通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传递.
UDP传输
DatagramSocket与DatagramPacket.
建立发送端,接收端.
建立数据包
调用Socket的发送接收方法.
关闭Socket
发送端与接收端是两个独立的运行程序.
练习:
importjava.net.*;
importjava.io.*;
public class UdpDemo3
{
public static void main(String[] args)
{
try
{
DatagramSocket sendDS = new DatagramSocket();
DatagramSocket receDS = new DatagramSocket(10014);
Send send = new Send(sendDS);
Rece rece = new Rece(receDS);
Thread t1 = new Thread(send);
Thread t2 = new Thread(rece);
t1.start();
t2.start();
}
catch (SocketException e)
{
e.printStackTrace();
}
}
}
class Send implements Runnable
{
private DatagramSocketds;
public Send(DatagramSocket ds)
{
this.ds = ds;
}
byte[] buf = null;
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try
{
while ((line = br.readLine()) !=null)
{
if ("end".equals(line))
break;
buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getByName("127.0.0.1"), 10014);//为么每次运行都要修端口号,是不是被占用
ds.send(dp);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (ds !=null)
ds.close();
}
}
}
class Rece implements Runnable
{
private DatagramSocketds;
public Rece(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
byte[] buf =new byte[1024 * 64];
while (true)//端口被占,运行报异常.
{
DatagramPacket dp = new DatagramPacket(buf, buf.length);
try
{
ds.receive(dp);
String data = new String(dp.getData(), 0, dp.getLength());
String ip =dp.getAddress().getHostAddress();
System.out.println("IP" + ip +":" + data + ".......端口:" + dp.getPort());
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (ds !=null)
ds.close();
}
}
}
}
TCP传输
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中和IO流进行数据的传输
关闭Socket,同样客户端和服务器端是两个独立的应用程序
练习:
/*
* 需求:建立一个文本转换服务器 客户端给服务端发送文本,服务端会将文本转成大写在返回给客户端,而且客户湍可以不断的进行文本转换 当客户湍输入OVER时结束
* 分析:客户湍: 因为是操作键盘,所以使用IO技术,并按IO的操作规律来思考 源:键盘输入 目的:网络设备,网络输出流,而且操作的是文本数据可以选择字符流
* 步骤: 1.建立服务 2.获取键盘录入 3.将数据发给客户端 4.去服务端返回大写数据 5.结束,关闭资源
*/
importjava.net.*;
importjava.io.*;
public class TcpDemo2
{
public static void main(String[] args)
{
try
{
//创建线程并运行
new Thread(new TcpServer2(new ServerSocket(10007))).start();
new Thread(new TcpClient2(new Socket("127.0.0.1", 10007))).start();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
classTcpClient2implements Runnable
{
private Sockets;
public TcpClient2(Socket s)
{
this.s = s;
}
public void run()
{
//建立缓冲
BufferedReader br = null;
BufferedWriter bw = null;
BufferedReader brs = null;
try
{
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
brs = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while ((line = br.readLine()) !=null)
{
if ("end".equals(line))
break;
bw.write(line);
bw.newLine();// 必须加上换行,不然服务器端的ReadLine()不会返回数据,因为只有当读到"\r\n"时才停止
bw.flush();// 因为是写入缓冲里,所以得刷新
line = brs.readLine();
System.out.println(s.getInetAddress().getHostAddress()//获取ip
+ "服务端处理后信息::" + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (s !=null)
try
{
s.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
if (br !=null)
try
{
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
classTcpServer2implements Runnable
{
private ServerSocketss;
public TcpServer2(ServerSocket ss)
{
this.ss = ss;
}
public void run()
{
BufferedReader br = null;
BufferedWriter bw = null;
Socket s = null;
try
{
s = ss.accept();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// bw = new BufferedWriter(newOutputStreamWriter(s.getOutputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
String line = null;
while ((line = br.readLine()) !=null)
{
System.out.println(s.getInetAddress().getHostAddress()
+ "客户端发过来的文本::" + line);
// bw.write(line.toUpperCase());
// bw.newLine();//必须加上换行,不然服客户端的ReadLine()不会返回数据,因为只有当读到"\r\n"时才停止
// bw.flush();
pw.println(line.toUpperCase());
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (ss !=null)
try
{
ss.close();
}
catch (IOException e)
{
e.printStackTrace();
}
if (s !=null)
try
{
s.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}