Socket--java网络编程

------- android培训java培训、期待与您交流! ----------

网络编程

抽象:网络实现计算机间,电子设备间数据的信息传递和资源共享;

模型:四层网络模型(应用层,传输层,网际层,数据链路层),在网络间传输的传输协议,1应用层的有Http,Https,Ftp等;2传输层tcp/udp;3网际层ip地址,通常我将端口号也加入到这个层来,以便忘记了;

概念:java对这种通信机制进行了封装,四要素:

Socket机制:

              1)通信两端都应该有Socket对象

              2)所有的通信都是通过Socket间的IO进行操作的

UDP协议:1)数据报包:DatagramSocket,DatagramPacket

2)特点:数据打包,传输数据有限制(64k),面向不连接,速度快,不可靠

TCP协议:1)连接通道:Socket,ServerSocket,通过三次握手机制,通常在创建对象时就已经连接好了,否则会连接不成功,报异常,通常简练Tcp连接也是比较费资源的。

2)特点:建立数据通道,传输数据无限制,速度低,可靠

Ip: 硬件的ID,就和身份证件一样:InetAddress

端口:其实每一个应用程序都有一个端口号(逻辑端口),只要是IO流相关的都有端口号,端口是应用程序在操作系统中注册的一个标识,用来给操作系统监听的。范围:0-65535。其中0-1024不建议使用,因为为系统占用的端口号;

原理:不管是Udp还是Tcp底层都的都是IO流来传递数据的,因为网络只是一个信息传递的介质

UDP两端步骤:老师比喻的非常形象,去邮局邮寄东西,但是注意异常处理

            发送端:

1,建立UDPSocket服务;

2,创建数据报包,将数据封装到包中,主机,端口,数据,注意,作为发送端,发送的ip地址和对应的端口好必须定义在数据报包中;

3,通过Socket发送出数据报包

4,关闭资源

接收端:

1,建立UDPSocket服务,并监听端口;

2,定义数据报包对象,用于存储发送过来的数据,因为这个数据包提供了对数据的解析功能

3,通过socket的Receive()方法接收数据并存放到数据报包中

4,解析数据报

5,关闭资源;

注意:udp发送端和接收端,谁先启动没有影响,因为无连接;但是为了能看到效果,一般先启动服务端,因为socket的接收方法是阻塞式的;

Tcp两端步骤:

1因为tcp是面向连接的,所以先要建立连接,在两端形成通路以后在通道内交互数据;

2当创建好了对象之后,连接就完成了,只需要监听就可以了建立连接比较耗费资源,tcp为每一个客户端都建立一个socket连接对象,不冲突

代码练习:

1用UDP事项聊天小程序:

/**
 * 聊天客户端

同时进行,要实现用多线程技术
 */
public class UdpChatClient implements Runnable {
DatagramSocket ds = null;
public UdpChatClient(DatagramSocket client) {
this.ds = client;
}
@Override
public void run() {

//封装键盘输入
BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while ((line = sc.readLine()) != null && (!"".equals(line))) {
if (line.equals("晚了睡了")) {
break;
}
byte[] data = line.getBytes();
DatagramPacket dp = null;
try {
// 包装发送数据,写标签
dp = new DatagramPacket(data, 0, data.length,
InetAddress.getByName("127.0.0.1"), 7000);

//发送
ds.send(dp);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//接收端,自己和自己聊,没有实现接收端的发送功能

public class ReceverThread implements Runnable{
private DatagramSocket ds;
public ReceverThread(DatagramSocket ds) {
this.ds=ds;
}
@Override
public void run() {
DatagramPacket p=null;
//接收
while(true){
byte[] recData=new byte[1024];
p=new DatagramPacket(recData,recData.length);
try {
ds.receive(p);
String s=new String(p.getData());
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}

}

Tcp实现文件上传:

客户端:

public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {

//创建连接
Socket s=new Socket(InetAddress.getByName("127.0.0.1"),3636);
//向通道写文件,高效流
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//读取要上穿传的文件流
String filePath="C:\\Users\\WakeHibernate\\Desktop\\copy\\Test910.txt";
File file=new File(filePath);
BufferedReader br=new BufferedReader(new FileReader(file));
//读写
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//关闭资源
bw.close();
br.close();
s.close();
}
}

服务端:

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

//监听端口
ServerSocket ss=new ServerSocket(3636);
//获得一个连接点对象,简历通道
Socket flowS=ss.accept();
InputStream in=flowS.getInputStream();
//源
BufferedReader br=new BufferedReader(new InputStreamReader(in));
//目的
BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\WakeHibernate\\Desktop\\456\\m.txt"));
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}

总结:

1tcp,udp,其实还是在使用流技术来进行交互。

2多线程在实现tcp编程编程是要注意监听IO流方法的阻塞。

3要理清客户端与服务端的交互关系


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值