day23网络编程UDP,TCP。IP。DatagramSocket。DatagramPacket。聊天程序。TCP传输。文本转换服务器。

来源:互联网 发布:雷巴的冒险修改数据 编辑:程序博客网 时间:2024/06/08 10:10
/*网络编程UDP,TCP。IP。DatagramSocket。DatagramPacket。聊天程序。TCP传输。文本转换服务器。*///网络编程//图片。。网络编程逻辑端口


 

//(127.0.0.1)计算机本地默认地址。/*系统保留端口(0-1024)*/import java.net.*;class  IPDemo//演示IP地址,对象InetAddress{public static void main(String[] args) throws Exception{/*InetAddress i = InetAddress.getLocalHost();//返回本地主机,会抛出异常System.out.println(i.toString());System.out.println(i.getHostAddress());//地址System.out.println(i.getHostName());//名称*///InetAddress ia = InetAddress.getByName("www.baidu.com");可以拿baidu的。InetAddress ia = InetAddress.getByName("192.168.1.254");//拿任意一台主机的System.out.println("address:"+ia.getHostAddress());System.out.println("name:"+ia.getHostName());}}/*UDP:将数据及源和目的封装成数据包中,不需要建立连接。每个数据包的大小限制在64K内因为无连接,是不可靠协议不需要建立连接,速度快。TCP:建立连接,形成传输数据的通道在连接中进行大数据传输通过三次握手完成连接,是可靠协议必须建立连接,效率会稍低。Socket:Socket就是为网络服务提供的一种机制通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。Socket:相当于码头,通信要先有Socket.UDP传输DatagramSocket与Datagrampacket建立发送端,接收端。建立数据包调用Socket的发送接收方法关闭Socket.发送端和接收端是二个独立运行程序.DatagramSocket:能发能收。Datagrampacket:数据报包。*/import java.net.*;/*1,建立udpsocket服务。2,提供数据,并将数据封装到数据包中。3,通过socket服务的发送功能,将数据包发出去。4,关闭资源。*/class  UdpSend{public static void main(String[] args) throws Exception{//1创建udp服务,通过DatagramSocket对象DatagramSocket ds = new DatagramSocket();//2确定数据,并封装成数据包。byte[] buf = "udp ge men lai le ".getBytes();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);//3,通过socked服务,将已有的数据包发送出去,通过send方法ds.send(dp);//4关闭资源ds.close();}}/*需要:定义一个应用程序,用于接收udp协议传输的数据并处理。思路:1,定义一个udpCocket服务。通常会监听一个端口,端口就是数字标识。2,定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。3。通过socket服务的receive方法将收到的数据存入已定义好的数据包中。4。通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。5。关闭资源。*/class  UdpRece{public static void main(String[] args) throws Exception{//1定义一个udpCocket服务。通常会监听一个端口,DatagramSocket ds = new DatagramSocket(10000);while(true){//可以一直接收数据,但是Socket服务要建立在外面。//2定义一个数据包,接收信息byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);//3通过socket服务的receive方法ds.receive(dp);//4通过数据包对象的特有功能String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());//这里要记清。int port = dp.getPort();//获取端口System.out.println(ip+"::"+data+"::"+port);//5关闭资源。//ds.close();//while循环的时候不能再关,一直接收。}}}/*192.168.1.255广播地址。*/import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;//录入键盘输入public class ChatDemo {public static void main(String[] args) {// TODO Auto-generated method stub}}class SendDemo{public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line=bufr.readLine())!=null){byte[] buf = line.getBytes();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);ds.send(dp);}ds.close();}}class ReceiveDemo{public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket(10001);while(true){byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());int port = dp.getPort();System.out.println(ip+"::"+port+"::"+data);//System.out.println(dp.getAddress());}}}/*编写一个聊天程序有收数据的部分,和发数据的部分这二部分需要同时执行,那就需要多线程技术一个线程收,一个线程控制发。因为收和发动作是不一致的,所以定义二个run方法。*/import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;public class ChatDemo2 {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubDatagramSocket ds = new DatagramSocket();DatagramSocket dds = new DatagramSocket(10005);new Thread(new Receive(dds)).start();new Thread(new Send(dds)).start();}}class Send implements Runnable{private DatagramSocket ds;Send(DatagramSocket ds){this.ds = ds;}public void run(){BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;try {while((line = bufr.readLine())!=null){byte[] buf = line.getBytes();DatagramPacket dp = new DatagramPacket(buf,0,buf.length,InetAddress.getByName("127.0.0.1"),10005);ds.send(dp);}} catch (Exception e) {e.printStackTrace();}}}class Receive implements Runnable{private DatagramSocket ds;Receive(DatagramSocket ds){this.ds = ds;}public void run(){while(true){byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);try {ds.receive(dp);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());System.out.println(ip+":"+data);}}}/*TCP传输Socket和ServerSocket建立客户端和服务器端建立连接后,通过Socket中的IO流进行数据的传输。关闭socket.同样,客户端和服务端也是二个独立的应用程序。演示TCP传输。1.tcp分客户端和服务端。2。客户端对对应的是Socket.服务端对应的是ServerSocket.客户端:通过查阅Socket对象,发现该对象建立时,就可以去连接指定主机因为tcp是面向连接的,所以建立socket时。就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。*/import java.io.*;import java.net.*;//给服务端发送一个文本数据class TcpClient //客户端{public static void main(String[] args) throws Exception{//1.创建Socket服务,并指定要连接的主机和端口。Socket s = new Socket("127.0.0.1",10003);//为了发送数据,要获取Socket流中的输出流。OutputStream out = s.getOutputStream();//拿到输出流out.write("tcp gao gao gao ".getBytes());s.close();}}/*1.建立服务端的ServerSocket(),并监听一个端口;2.获取连接过来的客户端对象。通过accept()方法,没有连接就会等,阻塞式的。3.客户端如果发过来数据,那么服务端要使用接收到的客户端对象,然后通过该对象拿到读取流。来读取发过来的数据。4.可选.关闭服务端。*/class  TcpServer{public static void main(String[] args) {ServerSocket ss = new ServerSocket(10003);Socket s = ss.accept();//服务端可以拿到客户端的对象String ip = s.getInetAddress().getHostAddress();//客户端对象有封装IP//服务端可以拿到客户端的对象,进而拿到客户端的输出输入流InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String text = new String(buf,0,len);System.out.println(ip+"..."text);s.close();//服务端可能不关自己,但要关对方。ss.close();}}import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;//TCP的客户端和服务端交互public class SocketDemo2 {public static void main(String[] args) throws  IOException {Socket s = new Socket("127.0.0.1",10009);OutputStream os = s.getOutputStream();os.write("lei le".getBytes());InputStream is = s.getInputStream();byte[] buf = new byte[1024];int len = is.read(buf);System.out.println(new String(buf,0,len));s.close();}}class ServerSocket2{public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10009);Socket s = ss.accept();System.out.println(s.getInetAddress().getHostAddress());InputStream is = s.getInputStream();byte[] buf = new byte[1024];int len = is.read(buf);System.out.println(new String(buf,0,len));OutputStream os = s.getOutputStream();os.write("收到,你也好".getBytes());s.close();ss.close();}}/*需求:建立一个文本转换服务器。客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。注意用字符缓冲区,readLine()方法的结束标记,还有BufferWriter缓冲区要刷新。还有PrintWriter打印流的应用。可以接收字节流和字符流。*/import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;class SocketTest{public static void main(String[] args) throws UnknownHostException, IOException {Socket s = new Socket("127.0.0.1",10009);BufferedReader bufr = new BufferedReader(//读取键盘new InputStreamReader(System.in));String line = null;OutputStream os = s.getOutputStream();InputStream is = s.getInputStream();//读取返回的数据byte[] buf = new byte[1024];while((line = bufr.readLine())!=null){os.write(line.getBytes());if("over".equals(line))break;int len = is.read(buf);String text = new String(buf,0,len);System.out.println("server:"+text);}}}class ServerSocketTest{public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10009);Socket s = ss.accept();InputStream is = s.getInputStream();OutputStream os = s.getOutputStream();byte[] buf = new byte[1024];int len = 0;while(true){len = is.read(buf);String text =  new String(buf,0,len);System.out.println("socket:"+text);os.write(text.toUpperCase().getBytes());if("over".equals(text))break;}}}import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;//复制各种文件的TCP传输class CopySocket{public static void main(String[] args) throws Exception {Socket s = new Socket("127.0.0.1",10007);File file = new File("1.jpg");if(!(file.exists()))throw new RuntimeException("文件不存在");BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));BufferedOutputStream bufout = new BufferedOutputStream(s.getOutputStream());byte[] buf = new byte[1024];int len = 0;while((len = in.read(buf))!=-1){bufout.write(buf, 0, len);bufout.flush();}s.shutdownOutput();//记得定义结束标记BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = bufin.readLine();System.out.println(line+"over");in.close();s.close();}}class CopyServerSocket{public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(10007);Socket s = ss.accept();BufferedInputStream bufin = new BufferedInputStream(s.getInputStream());BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("2copy2.jpg"));byte[] buf = new byte[1024];int len = 0;while((len = bufin.read(buf))!=-1){out.write(buf, 0, len);out.flush();}out.close();BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bufout.write("复制成功!!!");bufout.flush();//缓冲写入一定要刷新!!!!!!!!!!!!!//PrintWriter pw = new PrintWriter(s.getOutputStream(),true);//pw.println("复制成功!!!");System.out.println("server over");s.close();}}