java基础网络编程
来源:互联网 发布:网络热点词汇 编辑:程序博客网 时间:2024/06/11 05:07
利用网络,实现两台计算机之间的互相联通、交互。
网络编程有两类:
UDP
一种无连接的传输层协议。无连接:指不需要知道对方在不在,只负责发数据传输出去,而对方可能不在,数据便会丢失,所以是不稳定的。
甩代码了!
发送:SendDemo.java
import java.net.*;class SendDemo{ public static void main(String[] args) throws Exception{ //1.创建UDP服务,通过DatagramSocket对象 DatagramSocket ds=new DatagramSocket(7878); //2.确定数据,并封装成数据包,DatagramPacket byte[] buf="nihao hong".getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("10.73.131.122"),10000); //接受对象的ip(这里的ip写的是一个局域网内的ip,可以是本机)及端口 //3.通过socket服务,将现有的数据包发出去,通过send方法 ds.send(dp); //4.关闭资源,关闭的是使用网络的资源 ds.close(); }}
接受:ReceiveDemo.java
import java.net.*;class ReceiveDemo{ public static void main(String[] args) throws Exception{ //1.创建UDP socket,建立端点,设置接受者接收的端口 DatagramSocket ds=new DatagramSocket(10000); while(true){ //2.定义数据包,用于储存数据 byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); //3.通过服务的receive方法将收到数据存入数据包中 ds.receive(dp); //4.通过数据包的方法获取其中的数据 String ip=dp.getAddress().getHostAddress();//获得ip地址 String data=new String(dp.getData(),0,dp.getLength()); int port=dp.getPort();//得到发送端的端口 System.out.println(ip+"::"+data+"::"+port); } //5.关闭资源,我希望接收端能够一直接受,于是可以用死循环,但是由于死循环,代码无法走到这里,为图省事就注释了 //ds.close(); }}
知识点,也是注意点
1. 由于这是UDP,是一种不可靠的连接,所以我们需要先运行接收端,这样才能够接受。
2. 开始在进行测试两台计算机之间的互联时,一直连接不上,我们需要关闭防火墙。
飞Q
听说这是一个能够在局域网内实现通信的工具。
接下来是模拟飞Q的命令行版。
需要使用多线程,同时运行”接受者”和”发送者”。
加上界面话之后,我觉得和飞Q就不远了。
继续甩一对代码:Receiver.java
import java.net.*;import java.lang.*;import java.io.*;class Receiver{ public static void main(String[] args) throws Exception{ Thread t1=new Thread(new Send1()); Thread t2=new Thread(new Rece1()); t1.start(); t2.start(); // ds.close(); }}class Send1 implements Runnable{ @Override public void run(){ try{ DatagramSocket ds=new DatagramSocket(); int len=0; // byte[] buf=new byte[1024]; String buf; while(true){ buf=new BufferedReader(new InputStreamReader(System.in,"utf-8")).readLine(); // String str=new String(buf,0,len); DatagramPacket dp=new DatagramPacket(buf.getBytes(),buf.length(),InetAddress.getByName("10.73.131.122"),10000); ds.send(dp); } }catch (Exception e){ throw new RuntimeException("发送失败"); } }}class Rece1 implements Runnable{ @Override public void run(){ try{ DatagramSocket ds=new DatagramSocket(10001); while(true){ byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); ds.receive(dp); System.out.print("对方说:"); System.out.println(new String(dp.getData(),0,dp.getLength(),"utf-8")); } }catch (Exception e){ throw new RuntimeException("接受失败"); } }}
Sender.java
import java.net.*;import java.lang.*;import java.io.*;class Sender{ public static void main(String[] args) throws Exception{ Thread t1=new Thread(new Send1()); Thread t2=new Thread(new Rece1()); t1.start(); t2.start(); // ds.close(); }}class Send1 implements Runnable{ @Override public void run(){ try{ DatagramSocket ds=new DatagramSocket(); int len=0; // byte[] buf=new byte[1024]; String buf; while(true){ buf=new BufferedReader(new InputStreamReader(System.in,"utf-8")).readLine(); // String str=new String(buf,0,len); DatagramPacket dp=new DatagramPacket(buf.getBytes(),buf.getBytes().length,InetAddress.getByName("10.73.132.176"),10001); ds.send(dp); } }catch (Exception e){ throw new RuntimeException("发送失败"); } }}class Rece1 implements Runnable{ @Override public void run(){ try{ DatagramSocket ds=new DatagramSocket(10000); while(true){ byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); ds.receive(dp); System.out.print("对方说:"); System.out.println(new String(dp.getData(),0,dp.getLength(),"utf-8")); } }catch (Exception e){ throw new RuntimeException("接受失败"); } }}
知识点
1.这里是需要有两台机子相互通信,接收端需要设置义自己接受信息的端口,发送端需要设置自己发送目标的ip地址和端口
2.两台电脑间传输后可能会出现乱码的现象,不过往往是由于编译器不同引起的。大致原因有两个,一个是在键盘键入(System.in)时不同的编译器不同,所以可以使用转换流,将输入的内容的字节,通过指定的字符编码,将键入内容转化为相应编码的字符,再变为字节传输。另一个,接受时,接受的也是字节流,我们也可以用指定的字符编码进行读取。(InputStreamReader)
3.其实一个“发送”涉及输入流和输出流,一个输入流:从键盘得到数据,一个输出流:打包发送。
TCP
一种面向连接的、可靠的、基于字节流的传输层通信协议。需要三次握手。
三次握手,两次是客户端发给服务端的,中间隔了一次服务端发送给客户端。
需求,客户端给服务端发送消息,并能得到服务端的反馈。
甩代码:TcpServer2
import java.io.*;import java.net.*;class TcpServer2{ public static void main(String[] args) throws Exception{ ServerSocket ss=new ServerSocket(10023); Socket s=ss.accept(); System.out.println(s.getInetAddress().getHostAddress()+".....connection"); InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len; len=in.read(buf); System.out.println(new String(buf,0,len)); OutputStream out=s.getOutputStream(); out.write("我这收到啦!你也好".getBytes()); s.close(); ss.close(); }}
TcpClient2java
import java.io.*;import java.net.*;class TcpClient2{ public static void main(String[] args) throws Exception{ Socket s=new Socket("10.73.131.122",10023); OutputStream out=s.getOutputStream(); out.write("你好 服务端".getBytes()); InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len; len=in.read(buf); System.out.println(new String(buf,0,len)); s.close(); }}
知识点
由于这是可靠的TCP协议,客户端需要先和服务端建立连接,所以还是需要服务端先运行,当然,如果服务端未运行,或者在客户端运行过程中服务端挂了,那么,在客户端就会抛异常,由于可靠的连接被中断了。
下面的需求是客户端向服务端发送文件,文件传输结束后,给客户端返回传输成功信号
TextServer.java
import java.net.*;import java.io.*;class TextServer{ public static void main(String[] args) throws Exception{ ServerSocket ss=new ServerSocket(10023); Socket s=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter pw=new PrintWriter(new FileWriter("server.txt"),true); String str; while((str=br.readLine())!=null){ pw.println(str); } PrintWriter out=new PrintWriter(s.getOutputStream(),true); out.println("上传成功"); pw.close(); s.close(); ss.close(); }}
TextClient.java
import java.io.*;import java.net.*;class TextClient{ public static void main(String[] args) throws Exception{ Socket s=new Socket("10.73.131.122",10023); BufferedReader in=new BufferedReader(new FileReader("TcpServer2.java")); PrintWriter pw=new PrintWriter(s.getOutputStream(),true); String str=null; while((str=in.readLine())!=null){ pw.println(str); } s.shutdownOutput(); BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); String result=br.readLine(); System.out.println(result); in.close(); s.close(); } }
这里使用了PrintWriter,好处:字符流和字节流都可以直接写,而且可以实现续写 new PrintWriter(s.getOutputStream(),true) 定义的时候设置。
需求:客户端发送给服务端文字,服务端经过特殊处理(变成全大写返回),返回给客户端,在客户端输出。
TransServer.java
import java.io.*;import java.net.*;class TransServer{ public static void main(String[] args) throws Exception{ ServerSocket ss=new ServerSocket(10023); Socket s=ss.accept(); System.out.println(s.getInetAddress().getHostAddress()+"....connect"); BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String str=null; while((str=br.readLine())!=null){ String newStr=str.toUpperCase(); System.out.println("reply:"+newStr); out.write(newStr); out.newLine(); out.flush(); } s.close(); ss.close(); }}
TransClient.java
import java.io.*;import java.net.*;class TransClient{ public static void main(String[] args) throws Exception{ Socket s=new Socket("10.73.131.122",10023); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String str; while((str=br.readLine())!=null){ if("over".equals(str)){ break; } out.write(str); out.newLine(); out.flush(); BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); String result=in.readLine(); System.out.println(result); } br.close(); s.close(); }}
总结:
当客户端和服务端分离时,我们需要通过网络传输。
- JAVA网络编程基础
- Java网络编程基础
- java网络编程基础
- Java网络编程基础
- Java基础网络编程
- Java网络编程基础
- java基础<网络编程>
- java网络编程基础
- Java网络编程基础
- java基础:网络编程
- Java基础:网络编程
- 【java】网络编程基础
- java网络编程基础
- java网络编程基础
- Java基础--网络编程
- Java 网络编程基础
- Java基础:网络编程
- java基础--网络编程
- HDU
- response对象在servlet中的常用方法讲解
- 《剑指offer》刷题笔记(字符串):替换空格
- 抱着陌生的态度再看Rxjava(一)
- 设备驱动模型之driver
- java基础网络编程
- springboot微服务框架10分钟入门
- oracle 分区表简单应用
- NoSql
- Hibernate初始化时的Could not parse configuration
- Spring/mybatis整合之MapperScannerConfigurer和MapperFactoryBean区别
- 计算机组成原理知识点
- 设备驱动模型之bus
- 机器学习第十六课part3(Baum-Welch算法,Viterbi算法)