网络编程
InetAddress获取ip地址
package cn.edu.yulinu.demo;import java.net.InetAddress;import java.net.UnknownHostException;/* * 表示互联网的IP地址 * java.net.InetAddress * 静态方法 * static InetAddress getLocalHost() * 返回本地主机 */public class InetAddressDemo { public static void main(String[] args) throws UnknownHostException { function(); function1(); } /* * 拿自己ip */ public static void function() throws UnknownHostException { InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost); } /* * 拿别人ip */ public static void function1() throws UnknownHostException { InetAddress inet = InetAddress.getByName("stxf.yulinu.edu.cn"); System.out.println(inet); }}
udp接收和发送
UDPSend
package cn.edu.yulinu.demo1;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;/* * 实现UDP协议的发送端 * 实现我们封装数据的类java.net.DatagramPacket 将数据包包装 * 实现数据书传输的类ajva.net.DatagramSocket 将数据包发送出去 * * 实现步骤: * 1:创建DatagramPacket对象,封装数据,接收地址和端口 * 2:创建DatagramSocket * 3:调用DatagramSocket */public class UDPSend { public static void main(String[] args) throws IOException { //1:创建DatagramPacket对象,封装数据,接收地址和端口 byte[] date ="你好UDP".getBytes(); InetAddress inet = InetAddress.getByName("127.0.0.1"); DatagramPacket dp = new DatagramPacket(date, date.length, inet, 6000); //2:创建DatagramSocket DatagramSocket ds = new DatagramSocket(); //3:调用DatagramSocket ds.send(dp); //关闭资源 ds.close(); } }
UDPReceive
package cn.edu.yulinu.demo1;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;import java.util.Arrays;/* * 实现UDP接收端 * 实现封装数据博爱java.net.DatagramPacket将数据接收 * 实现输出传输java.net.DatagramSocket接收数据包 * 实现步骤: * 1:创建DatagramSocket对象,绑定端口号 要和发送端口号一致 * 2:创建字节数组,接收发来的数据 * 3:创建数据包对象DatagramPacket * 4:调用DatagramSocket对象方法receive(DatagramPacket dp)接收数据,数据放在数据包中 * 5:拆包(发送的IP地址,接收到的字节数组,发送方的端口号) */public class UDPReceive { public static void main(String[] args) throws IOException { //创建数据包传输对象DatagramSocket绑定端口号 DatagramSocket ds = new DatagramSocket(6000); //创建字节数据,接收数据 byte[] data = new byte[1024]; //拆个年间数据包对象传递字节数组 DatagramPacket dp = new DatagramPacket(data, data.length); //调用ds对象方法receive传递数据包 ds.receive(dp); int length = dp.getLength(); System.out.println(new String(data,0,length)); System.out.println(dp.getAddress().getHostAddress()+" "+dp.getPort()); ds.close(); }}
TCP接收和发送
TCPServer
package cn.edu.yulinu.demo3;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/* * 实现TCP服务器程序 * 表示服务器程序的类java.net.ServerSocket * 构造方法: * ServerSocket(int port)传递端口号 * * 很重要的事情,必须要获得客户端套接字对象 * Socket accept() */public class TCPServer { public static void main(String[] args) throws IOException { //创建服务器端连接对象 ServerSocket server = new ServerSocket(8888); //调用服务器套接字对象中的方法accept()获取客户端套接字对象 Socket socket = server.accept(); //通过客户端套接字对象,socket获取字节输入流,读取客户端发来的数据 InputStream in = socket.getInputStream(); byte[] date = new byte[1024]; int len = in.read(date); System.out.println(new String(date,0,len)); //服务器向客户端回数据,字节输出流,通过客户端套接字对象获取字节输出流 OutputStream out = socket.getOutputStream(); out.write("收到。谢谢".getBytes()); socket.close(); server.close(); }}
TCPClient
package cn.edu.yulinu.demo3;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;/* * 实现TCP客户端,连接到服务器 * 和服务器实现数据交换 * 实现TCP客户端程序的类java.net.Socket * 构造方法 * Socket(String host,int port)传递服务器IP和端口号 * 注意:构造方法只要运行,就会和服务器进行连接,连接失败就抛出异常 * OutputStream getOutputStream() 返回套接字输出流 * 作用:将套接字输出,输出到服务器中 * InputStrtem getInputStream()返回套接字输入流 * 作用:从服务器端读取数据 */public class TCPClient { public static void main(String[] args) throws IOException { //创建Socket对象,连接数据库 Socket socket = new Socket("127.0.0.1",8888); //通过客户端的套接字对象Socket方法,获取字节输出流,将数据写向服务器 OutputStream out = socket.getOutputStream(); out.write("服务器OK".getBytes()); //读取服务器发回的数据,是信用socket套接字对象的字节输入流 InputStream in = socket.getInputStream(); byte[] data = new byte[1024]; int len = in.read(data); System.out.println(new String(data,0,len)); socket.close(); }}
TCP上传图片案例
TCPServer
package cn.edu.yulinu.demo4;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Random;/* * TCP图片上传服务器 * 1:ServerSocket套接字对象,监听端口8000 * 2:方法accept()获取客户端的连接对象 * 3:客户端连接对象获取字节输入流,读取客户端发送图片 * 4:创建一个File对象,绑定上传的文件夹 * 判断文件夹是否存在,文件夹不存在就创建 * 5:创建一个字节输出流,输出流的目的是File对象所在的文件夹 * 6:字节流读取图片,字节流将图片写入到目的文件夹中 * 7:将上传成功协会客户端 * 8:关闭资源 */public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8000); Socket socket = server.accept(); //通过客户端连接对象,读取字节输入流,读取客户端图片 InputStream in = socket.getInputStream(); //将目的文件夹封装到File对象 File upload = new File("images\\upload"); if(!upload.exists()) { upload.mkdirs(); } //为了防止文件同名覆盖重新定义文件名 //规则:域名+毫秒值+6位随机数 String filename = "yulinu"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg"; //创建字节输出流,将图片写入到目的文件夹中 FileOutputStream fos = new FileOutputStream(upload+File.separator+filename); //读写字节数组 byte[] bytes = new byte[1024]; int len = 0; while((len=in.read(bytes))!=-1) { fos.write(bytes, 0, len); } //通过客户端连接获取字节输出流 //将上传成功写回 socket.getOutputStream().write("上传成功".getBytes()); fos.close(); socket.close(); server.close(); }}
TCPClient
package cn.edu.yulinu.demo4;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/* * 实现RCP图片上传案列 * 实现步骤: * 1;socket套接字连接服务器 * 2:通过socket获取字节输出流,目的是为了写图片 * 3:使用自己的流对象,读取图片数据源 * FileInputStream * 4:读取图片使用字节输出流,将图片写道服务器 * 采用字节数组做缓冲 * 5:通过Socket套接字获取字节输入流 * 读取服务器发回来的上传成功 * 6:关闭资源 */public class TCPClient { public static void main(String[] args) throws IOException{ Socket socket = new Socket("127.0.0.1",8000); //获取字节输出流,将图片写到服务器中 OutputStream out = socket.getOutputStream(); FileInputStream fis = new FileInputStream("e:\\a.jpg"); int len = 0; byte[] bytes = new byte[1024]; while((len=fis.read(bytes))!=-1) { out.write(bytes,0,len); } //给服务器写终止序列 socket.shutdownOutput(); //获取字节输入流,获取服务器的上传成功 InputStream in = socket.getInputStream(); byte[] bytess = new byte[1024]; len = in.read(bytess); System.out.println(new String(bytess,0,len)); fis.close(); socket.close(); }}
上传图片多线程改进版
TCPClient
package cn.edu.yulinu.demo4;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/* * 实现RCP图片上传案列 * 实现步骤: * 1;socket套接字连接服务器 * 2:通过socket获取字节输出流,目的是为了写图片 * 3:使用自己的流对象,读取图片数据源 * FileInputStream * 4:读取图片使用字节输出流,将图片写道服务器 * 采用字节数组做缓冲 * 5:通过Socket套接字获取字节输入流 * 读取服务器发回来的上传成功 * 6:关闭资源 */public class TCPClient { public static void main(String[] args) throws IOException{ Socket socket = new Socket("127.0.0.1",8000); //获取字节输出流,将图片写到服务器中 OutputStream out = socket.getOutputStream(); FileInputStream fis = new FileInputStream("e:\\a.jpg"); int len = 0; byte[] bytes = new byte[1024]; while((len=fis.read(bytes))!=-1) { out.write(bytes,0,len); } //给服务器写终止序列 socket.shutdownOutput(); //获取字节输入流,获取服务器的上传成功 InputStream in = socket.getInputStream(); byte[] bytess = new byte[1024]; len = in.read(bytess); System.out.println(new String(bytess,0,len)); fis.close(); socket.close(); }}
Upload
package cn.edu.yulinu.demo4;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Random;public class Upload implements Runnable { private Socket socket; public Upload(Socket socket) { this.socket=socket; } @Override public void run() { try { // TODO Auto-generated method stub //通过客户端连接对象,读取字节输入流,读取客户端图片 InputStream in = socket.getInputStream(); //将目的文件夹封装到File对象 File upload = new File("images\\upload"); if(!upload.exists()) { upload.mkdirs(); } //为了防止文件同名覆盖重新定义文件名 //规则:域名+毫秒值+6位随机数 String filename = "yulinu"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg"; //创建字节输出流,将图片写入到目的文件夹中 FileOutputStream fos = new FileOutputStream(upload+File.separator+filename); //读写字节数组 byte[] bytes = new byte[1024]; int len = 0; while((len=in.read(bytes))!=-1) { fos.write(bytes, 0, len); } //通过客户端连接获取字节输出流 //将上传成功写回 socket.getOutputStream().write("上传成功".getBytes()); fos.close(); socket.close(); }catch(IOException e) { } }}
TCPThreadServer
package cn.edu.yulinu.demo4;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class TCPThreadServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8000); while(true) { Socket socket =server.accept(); new Thread(new Upload(socket)).start(); } }}