黑马程序员——网络编程

来源:互联网 发布:流行朋克知乎 编辑:程序博客网 时间:2024/05/16 08:03
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、IP地址(InetAddress)

InetAddress:构造方法私有,不能直接创建对象。InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。InetAddress getLocalHost():返回本地主机。InetAddress[] getAllByName(String host)ip.getHostAddress(), ip.getHostName()
代码示例:
public class NetLearning1 {        public static void main(String[] args) throws Exception {InetAddress address = InetAddress.getLocalHost();System.out.println(address.toString());System.out.println(address.getHostAddress());System.out.println(address.getHostName());InetAddress address2 = InetAddress.getByName("www.baidu.com");System.out.println(address2.toString());System.out.println(address2.getHostAddress());System.out.println(address2.getHostName());}}

二、UDP传输
①:只要是网络传输,必须有socket 。②:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。直接操作UDP不可能,对于java语言应该将UDP封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了UDP传输协议的socket对象。因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。DatagramSocket具备发送和接受功能,在进行UDP传输时,需要明确一个是发送端,一个是接收端。UDP的发送端:①:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。②:明确要发送的具体数据。③:将数据封装成了数据包。④:用socket服务的send方法将数据包发送出去。⑤:关闭资源。
UDP的接收端:①:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。②:定义数据包,用于存储接收到数据。③:通过socket服务的接收方法将收到的数据存储到数据包中。④:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。⑤:关闭资源。
代码示例:
//发送端(客户端)public class UDPSend {public static void main(String[] args) throws Exception {//创建UDP服务DatagramSocket datagramSocket = new DatagramSocket(8888);//封装数据byte[] buf = "jnfblnblfk. jngdbvs  mlsfdjxlgbjndl".getBytes();DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length,InetAddress.getByName("222.191.193.96"),10000);;//发送数据包datagramSocket.send(datagramPacket);//关闭资源datagramSocket.close();}}
//服务端(接收端)public class UDPReceive {public static void main(String[] args) throws IOException {//1.定义Socket服务,建立端点DatagramSocket datagramSocket= new DatagramSocket(10000);while (true) {//2.定义数据包byte[] buf = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);//3.将接受到的数据存入数据包中datagramSocket.receive(datagramPacket);//4.取出数据String ip = datagramPacket.getAddress().getHostAddress();String data = new String(datagramPacket.getData(),0,datagramPacket.getLength());int port = datagramPacket.getPort();System.out.println(ip + "::" + data + "::" + port);}//5.关闭资源//datagramSocket.close();}}
UDP练习1:通过键盘录入获取要发送的信息。将发送和接收分别封装到两个线程中。代码示例:
//发送端(客户端)public class UDPSend2 {public static void main(String[] args) throws Exception {//创建UDP服务DatagramSocket datagramSocket = new DatagramSocket();//封装数据BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = bufr.readLine())!= null){if("886".equals(line))break;byte[] buf = line.getBytes();DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length,InetAddress.getByName("222.191.193.96"),20000);;//发送数据包datagramSocket.send(datagramPacket);}//关闭资源datagramSocket.close();}}
//服务端public class UDPReceive2 {public static void main(String[] args) throws Exception {//1.定义Socket服务,建立端点DatagramSocket datagramSocket= new DatagramSocket(20000);while (true) {//2.定义数据包byte[] buf = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);//3.将接受到的数据存入数据包中datagramSocket.receive(datagramPacket);//4.取出数据String ip = datagramPacket.getAddress().getHostAddress();String data = new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println(ip + "::" + data);}//5.关闭资源//datagramSocket.close();}}
UDP练习2:一个聊天的例子,利用UDP传输协议。代码示例:
//服务端(客户端)public class Send implements Runnable{private DatagramSocket datagramSocket;public Send(DatagramSocket datagramSocket){this.datagramSocket = datagramSocket;}@Overridepublic void run() {try {BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = bufr.readLine())!= null){if("886".equals(line))break;byte[] buf = line.getBytes();DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length,InetAddress.getByName("222.191.193.96"),30000);;datagramSocket.send(datagramPacket);}} catch (UnknownHostException e) {throw new RuntimeException("发送失败!!!");} catch (IOException e) {throw new RuntimeException("发送失败!!!");}//关闭资源datagramSocket.close();}}
//接收端public class Receive implements Runnable{private DatagramSocket datagramSocket;public Receive(DatagramSocket datagramSocket){this.datagramSocket = datagramSocket;}@Overridepublic void run() {try {while (true) {byte[] buf = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);datagramSocket.receive(datagramPacket);String ip = datagramPacket.getAddress().getHostAddress();String data = new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println(ip + " :: " + data);}} catch (IOException e) {throw new RuntimeException("接收失败!!!");}}}
public class mainClass {public static void main(String[] args) throws SocketException {DatagramSocket datagramSocketSend = new DatagramSocket();DatagramSocket datagramSocketReceive = new DatagramSocket(30000);new Thread(new Send(datagramSocketSend)).start();new Thread(new Receive(datagramSocketReceive)).start();}}

三、TCP传输
TCP传输:两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。TCP的两个端点:一个是客户端,一个是服务端。客户端:对应的对象,Socket;服务端:对应的对象,ServerSocket。TCP客户端:①:建立TCP的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。②:如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。③:关闭资源。TCP服务端:①:创建服务端socket服务,并监听一个端口。②:服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象。③:可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。④:如果通讯结束,关闭资源。注意:要先关客户端,再关服务端。总结:对于UDP和TCP,既可以定义输出流也可以创建输入流,具体情况根据需要构建;比如:我们需要客户端给服务器端发送数据,服务器端再给客户端反馈数据;那么就要在客户端和服务器端分别多加一个输入流和输出流!否则,发不出去,收不到!
代码示例:
//TCP客户端public class TCPClient {public static void main(String[] args) throws Exception {//1.创建客户端的Socket服务Socket socket = new Socket("222.191.193.96",20001);OutputStream outputStream = socket.getOutputStream();outputStream.write("waqswedrfytguhkisewdrytguhki".getBytes());socket.close();}}
//TCP服务端public class TCPServer {public static void main(String[] args) throws Exception {//创建服务端Socket服务  SeverSocketServerSocket serverSocket = new ServerSocket(20001);//获取客户端对象Socket socket = serverSocket.accept();String ip = socket.getInetAddress().getHostAddress();System.out.println(ip + ".......connected");//读取数据InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int len = inputStream.read(buf);System.out.println(new String(buf,0,len));socket.close();serverSocket.close();  //可选}}
TCP练习1:建立文本转换服务器。客户端给服务端发送文本,服务端会把文本转换成大写返回给客户端。而且客户端可以不断的进行文本转换。当客户端输入over时,转换结束。
public class TransClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("222.191.193.96",20003);//定义读取键盘的数据流对象BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//将数据写入到Socket输出流,将数据发送到服务端BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//定义Socket读取流,读取服务端返回的大写信息BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;while((line = bufr.readLine())!= null){if("over".equals(line))break;bufOut.write(line);bufOut.newLine();bufOut.flush();String string = bufIn.readLine();System.out.println(string);}bufr.close();socket.close();}}
public class TransSever {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(20003);Socket socket = serverSocket.accept();String ip = socket.getInetAddress().getHostAddress();System.out.println(ip + ".......connected");//读取Socket读取流中的数据BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));//将大写数据写入到Socket的输出流,发送到客户端BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String line = null;while((line = bufIn.readLine())!= null){System.out.println(line);bufOut.write(line.toUpperCase());bufOut.newLine();bufOut.flush();}socket.close();serverSocket.close();  //可选}}
TCP练习2:TCP文件复制。
public class TextClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("222.191.193.96",20004);BufferedReader bufr = new BufferedReader(new FileReader("Test.txt"));PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);//DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());//long time = System.currentTimeMillis();//dataOutputStream.writeLong(time); String line = null;while((line = bufr.readLine())!= null){printWriter.println(line);}socket.shutdownOutput();//printWriter.println(time);BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));String string = bufIn.readLine();System.out.println(string);bufr.close();socket.close();}}
public class TextServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(20004);Socket socket = serverSocket.accept();String ip = socket.getInetAddress().getHostAddress();System.out.println(ip + ".......connected");//DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());//long time = dataInputStream.readLong();BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter printWriter = new PrintWriter(new FileWriter("Sever.txt"),true);String line = null;while((line = bufIn.readLine())!= null){//if("over".equals(line))//break;printWriter.println(line);}PrintWriter printWriters = new PrintWriter(socket.getOutputStream(),true);printWriters.println("OK!!!");printWriter.close();socket.close();serverSocket.close();}}
TCP练习3:TCP上传图片到服务端(并发上传)。
public class PicClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("49.76.88.254",20005);FileInputStream fileInputStream = new FileInputStream("1.png");OutputStream outputStream = socket.getOutputStream();byte[] buf = new byte[1024];int len = 0;while ((len = fileInputStream.read(buf)) != -1) {outputStream.write(buf, 0, len);}socket.shutdownOutput();InputStream inputStream = socket.getInputStream();byte[] bufIn = new byte[1024];int lens = inputStream.read(bufIn);System.out.println(new String(bufIn,0,lens));fileInputStream.close();socket.close();}}
public class PicThread implements Runnable{private Socket socket;public PicThread(Socket socket){this.socket = socket;}@Overridepublic void run() {int count = 1;String ip = socket.getInetAddress().getHostAddress();try {System.out.println(ip + ".......connected");InputStream inputStream = socket.getInputStream();File file = new File(ip +"(" + count + ")" +  ".png");while(file.exists()){file = new File(ip +"(" + (count++) + ")" +  ".png");}FileOutputStream fileOutputStream = new FileOutputStream(file);byte[] buf = new byte[1024];int len = 0;while ((len = inputStream.read(buf)) != -1) {fileOutputStream.write(buf, 0, len);}OutputStream outputStream = socket.getOutputStream();outputStream.write("上传成功!!!".getBytes());fileOutputStream.close();socket.close();} catch (FileNotFoundException e) {throw new RuntimeException(ip + "上传失败!!!");} catch (IOException e) {throw new RuntimeException(ip + "上传失败!!!");}}}
public class PicServer {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(20005);while (true) {Socket socket = serverSocket.accept();new Thread(new PicThread(socket)).start();}//serverSocket.close();}}
TCP练习4:TCP客户端并发登陆。
public class LoginClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("58.214.45.14",20006);BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));for (int i = 0; i < 3; i++) {String line = bufr.readLine();if(line == null)break;printWriter.println(line);String infoString = bufIn.readLine();System.out.println("info" + infoString);if(infoString.contains("欢迎"))break;}bufr.close();socket.close();}}
public class LoginThread implements Runnable{private Socket socket;public LoginThread(Socket socket){this.socket = socket;}@Overridepublic void run() {String ip = socket.getInetAddress().getHostAddress();System.out.println(ip + ".......connected");try {for (int i = 0; i < 3; i++) {BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));String name = bufIn.readLine();if(name == null)break;BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);boolean flag = false;String line = null;while((line = bufr.readLine())!= null){if(line.equals(name)){flag = true;break;}}if(flag){System.out.println(name + "已登录!!!");printWriter.println(name + "欢迎光临!!!");break;}else{System.out.println(name + "尝试登录!!!");printWriter.println(name + "用户名不存在!!!");}}socket.close();} catch (FileNotFoundException e) {throw new RuntimeException(ip + "校验失败!!!");} catch (IOException e) {throw new RuntimeException(ip + "校验失败!!!");}}}
public class LoginServer {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(20006);while (true) {Socket socket = serverSocket.accept();new Thread(new LoginThread(socket)).start();}}}
TCP练习5:浏览器客户端-自定义服务端。
开启服务器,只需在浏览器中输入网址:本机IP地址+端口号
public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(30000);Socket socket = serverSocket.accept();String ip = socket.getInetAddress().getHostAddress();System.out.println(ip + ".......connected");InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int len = inputStream.read(buf);System.out.println(new String(buf,0,len));PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);printWriter.println("<font color='red' size='7'>欢迎光临!!!</font>");socket.close();serverSocket.close();}}




















0 0
原创粉丝点击