java网络编程
Java网络编程
-
网络编程也称套接字编程
-
网络通信=套接字通信,即socket
-
socket 套接字,插座
-
ip 指地址 每台计算机地址要不同
-
端口 指进程端口号 每个计算机的进程的端口号要不同
-
TCP 类似两者打电话,要先建立连接,建立连接要3次握手4次挥手,一般是客户端和服务端
-
UDP 类似发短信,不用连接,直接发,另一边可以自己去收,可能会出现丢包,一般是客户端之间
-
tcp麻烦但不宜丢包 udp简单但容易丢包
- 回车和换行的区别
- 回车enter 硬回车,段落直接换行,表示段落结束
- 换行CTRL+enter或者shift+enter软回车,只是光标下移,表示段落未结束
-
TCP
-
客户端
- socket 通过端口和ip建立连接
- os.write 发消息
-
服务端
- serversocket 建立进程端口
- accept 监听等待用户连接,返回客户端socket
- 接受用户消息
- byte[1024] is.read(bytes)缓存区,存读取数据到bytes中
- byteArrayOutPutStream,baos.write(bytes,0,length),写数据到bos中,防止中文太长越界
- bos.toString(),读取客户端数据,输出
-
io流
-
客户端 socket.getoutputstream os.write 往外写东西
-
服务端 serversocket.getinputstream is.read(new byte[1024])读is到数组bytes中
-
接收文件就用文件管道流,接收字符串就用字符串管道流
-
接收格式对应输出内容的格式
//接收文件,文件管道流接收 FileOutputStream fos = new FileOutputStream(new File("receive2.jpg")); byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1){ //写入fos fos.write(buffer,0,len); }//接收字符串,字符串管道流接收(字节数组) ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer2 = new byte[1024]; int len2; while ((len2=is.read(buffer2))!=-1){ //写入baos baos.write(buffer2,0,len2); } //转换成字符串并输出 System.out.println(baos.toString()); -
文件传输过程
将file变为fis->fis.read(clbuffer)fis读出文件->文件数据存入clbuffer->os.write(clbuffer,0,len)->将clbuffer写入osis.read(sebuffer) is读出os写入的数据->数据存入sebuffer->fos.write(sebuffer,0,len)->将sebuffer写入fos->fos变为fileis os对应,拥有相同数据
-
UDP
-
分为发送端和接收端,没有客户服务器的区分,两者可以同时是发送和接收
-
发送端
-
建立socket
DatagramSocket socket = new DatagramSocket(); -
建立包
port为目标端口DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port); -
发送包
socket.send(datagramPacket);
-
-
接收方
-
建立对应socket,要定义接收方端口,和发送方对应
-
创建数组建立包
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length); -
接收包
socke.receive(packet); System.out.println(new String(packet.getData(),0,packet.getLength()));
-
-
控制台输入
//接收控制台输入 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String msg = bufferedReader.readLine(); -
UDP多线程在线咨询
-
多线程要实现Runnable接口
public class TalkSend implements Runnable{ DatagramSocket socket = null; BufferedReader bufferedReader = null; private int fromPort; private int toPort; private String toIp; public TalkSend(int fromPort, int toPort, String toIp) { //发送方端口;目的端口;目的人地址 this.fromPort = fromPort; this.toPort = toPort; this.toIp = toIp; try { //需要接收的端口 socket = new DatagramSocket(fromPort); bufferedReader = new BufferedReader(new InputStreamReader(System.in)); } catch (Exception e) { throw new RuntimeException(e); } } } public class TalkReceive implements Runnable{ // 接收端口(=toPort);发送人名称 DatagramSocket socket = null; private int port; private String msgFromName; public TalkReceive(int port,String msgFromName) { this.port = port; this.msgFromName = msgFromName; try { socket = new DatagramSocket(port); } catch (Exception e) { throw new RuntimeException(e); } } } -
重写run方法,实现发送消息
@Override public void run() { while (true){ try { String msg = bufferedReader.readLine(); byte[] bytes = msg.getBytes(); DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, new InetSocketAddress(toIp,toPort)); socket.send(packet); if (msg.equals("end")) break; } catch (Exception e) { throw new RuntimeException(e); } } socket.close(); } @Override public void run() { while (true){ try { byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length); socket.receive(packet); byte[] data = packet.getData(); String s = new String(data, 0, packet.getLength()); System.out.println(msgFromName+":"+s); if (s.equals("end")) break; } catch (Exception e) { throw new RuntimeException(e); } } socket.close(); } -
创建线程,调用start()方法,start调用run方法
public static void main(String[] args) { new Thread(new TalkSend(5555,9999,"localhost")).start(); new Thread(new TalkReceive(8888,"学生")).start(); } public static void main(String[] args) { new Thread(new TalkSend(7777,8888,"localhost")).start(); new Thread(new TalkReceive(9999,"老师")).start(); } -
URL
-
统一资源定位符,定位互联网某一个资源
-
域名www.baidu.com,ip 127.0.0.1
-
域名解析是把域名解析为ip,域名为了好记
-
五部分组成,可以少不能多
协议://ip地址:端口/项目/资源
public class URLDemo01 { public static void main(String[] args) throws MalformedURLException { URL url = new URL("https://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123"); System.out.println(url.getProtocol());//协议 System.out.println(url.getHost());//ip System.out.println(url.getPort());//端口 System.out.println(url.getPath());//文件(项目) System.out.println(url.getFile());//文件全路径 System.out.println(url.getQuery());//参数 } } -
/*子类引用指向父类对象,不对 父类引用指向子类对象,对 我的理解是,右边代表实际大小,先创建,左边为引用 子类继承父类,所以子类占用空间更大 父类创建大小不够,就不行*/ Student student1 = new People(); -
public class URLDown { public static void main(String[] args) throws Exception { URL url = new URL("https://m10.music.126.net/20241104151656/39a2f4723d44fb7ba51813c995098ea8/yyaac/obj/wonDkMOGw6XDiTHCmMOi/2849745486/65c1/cb3b/e14e/67d13b0595b4313864e163c1db69cf7d.m4a?vuutv=vFr1k2kmyFwuOdGKS9tf9hhF0kjDp9zfMnuD6Ow7wMdsGgxGuI59WNe7IVST5jgIp1mxAIcrn6dTXb9fd/Txz5u1nhDGtKdpXKJEA5hhV0E="); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); InputStream is = httpURLConnection.getInputStream(); FileOutputStream fos = new FileOutputStream("hell.m4a"); byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1){ fos.write(buffer,0,len); } fos.close(); is.close(); httpURLConnection.disconnect(); } }
浙公网安备 33010602011771号