网络编程
网络编程的三个要素
1、IP地址或主机名
InetAddress
String:192.168.24.71 每一个整数是1~255
域名:www.baidu.com 通过域名解析器,找对对应的ip地址
2、端口号
0~65535
建议不要使用
0~1023 用于基础服务
tomcat/jboss 8080
mysql 3306
oracle 1521
sql server 1433
浏览器:http 80
3、网络协议
OSI理想参考模型
TCP/IP的四层实现模式
传输层
TCP
面向连接的,可靠的,适用于大数据传输,速率相对低,在传输之前会先“三次握手”,在断开之前会“四次挥手”
UDP
非面向连接的,不可靠的,适用于数据比较小的,<=64kb,相对速率高
应用层
http/https
ftp
网络编程的API
Socket
套接字 表示通信的两个端点,两边各一个
分类
流套接字 用于TCP通信
ServerSocket 转门用于服务器用来监听和接收客户端的连接
Socket 用于服务器和客户端的通信
数据报套接字 用于UDP的通信
DatagramSocket 用于UDP的两端的通信
TCP编程步骤
服务器
1、先创建ServerSocket
ServerSocket server = new ServerSocket(端口号);
指定端口号进行监听,客户端通过这个端口号与它进行连接和通信
2、接收客户端的连接
Socket socket = server.accept();
每一个客户端就要有自己的一个Socket
如果希望不同的客户端通信“同时”进行,需要每一个socket用一个线程进行维护
3、通过socket进行收或发消息
收消息 InputStream is = socket.getInputStream();
可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等
发消息 OutputStream out = socket.getOutputStream();
可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等
4、与客户端断开连接 socket.close();
客户端
1、先与服务器建立连接,通过创建一个Socket,要指定服务器的IP和端口号
Socket socket = new Socket(服务器的IP,服务器的监听端口号);
2、通过socket进行收或发消息
收消息 InputStream is = socket.getInputStream();
可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等
发消息 OutputStream out = socket.getOutputStream();
可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等
收和发可以用不同的线程进行维护
3、与客户端断开连接 socket.close();
//示例一 package com.atguigu.tcp1; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import org.junit.Test; /* * TCP:面向连接 * 通信的两端分角色:服务器端和客户端 * * 服务器端等着被连接,客户端主动连接 * * 服务器端: * 1、ServerSocket:用来接收客户端的连接信息 * 2、Socket:用来与某个客户端进行通信 * * 客户端: * 1、Socket:用来与服务器进行通信 * */ public class TestTCP1 { @Test public void server()throws Exception{ //1、创建ServerSocket,看成:开启服务器 ,需要指定一个端口号,监听是否有客户端来连接 ServerSocket ss = new ServerSocket(9090); while(true){ System.out.println("等待您的链接...."); //2、等待客户端的连接,接收客户端的连接(如果没有人连接,那么这句代码会阻塞) //一旦有客户端连接成功,那么就会产生一个Socket对象,专门负责和这个客户端通信 Socket socket = ss.accept(); System.out.println(socket.getInetAddress().getHostAddress()+"连接成功"); //3、可以接收消息,或发生消息 //例如:先发:“欢迎登陆” //在接收消息 //发消息:输出流,OutputStream OutputStream output = socket.getOutputStream(); output.write("欢迎登陆".getBytes()); socket.shutdownOutput(); //收消息 InputStream is = socket.getInputStream(); byte[] data = new byte[1024]; int len; StringBuilder sb = new StringBuilder(); while((len= is.read(data)) !=-1){ sb.append(new String(data,0,len)); } System.out.println("服务器收到的消息:" + sb); //4、关闭连接 socket.close();//只是与某个客户端断开 } //5、服务器关闭 // ss.close(); } @Test public void client()throws Exception{ //1、创建一个Socket,要指定服务器的IP和端口号 Socket socket = new Socket("192.168.24.71",9090); //2、接收消息 InputStream is = socket.getInputStream(); byte[] data = new byte[1024]; int len; StringBuilder sb = new StringBuilder(); while((len= is.read(data)) !=-1){ sb.append(new String(data,0,len)); } System.out.println("客户端收到的消息:" + sb); //3、发送消息 String info = "马上吃饭了"; OutputStream out = socket.getOutputStream(); out.write(info.getBytes()); //3、关闭连接 socket.close(); } }
//示例二 package com.atguigu.tcp2; 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.util.Scanner; import org.junit.Test; public class TestTCP2 { @Test public void server()throws Exception{ //1、创建ServerSocket ServerSocket server = new ServerSocket(9999); while(true){ //2、等待客户端的连接,接收客户端的连接 Socket socket = server.accept(); String clientIp = socket.getInetAddress().getHostAddress(); System.out.println(clientIp+"上线了"); //每一个客户端需要一个线程单独维护它的通信,“同时”与服务器通信的效果 new MessageHandler(socket).start(); } } //和服务器连接上以后,从键盘输入消息,给服务器发送,一直到从键盘输入byebye,在与服务端口连接 @Test public void client()throws Exception{ //1、连接服务器 Socket socket = new Socket("192.168.24.71",9999); OutputStream out = socket.getOutputStream(); //2,从键盘输入给服务器发送 Scanner input = new Scanner(System.in); while(true){ System.out.println("输入要发送的内容:"); String info = input.nextLine(); if("byebye".equals(info)){ break; } //给服务器发送 out.write((info+"\n").getBytes()); } //3、断开 socket.close(); } } class MessageHandler extends Thread{ private Socket socket; public MessageHandler(Socket socket) { super(); this.socket = socket; } public void run(){ try { //3、和一个客户端多次通信,接收到消息后,在控制台打印 InputStream input = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(input); BufferedReader br = new BufferedReader(isr); String str; while((str = br.readLine())!=null){ System.out.println(socket.getInetAddress().getHostAddress() +"说:"+ str); } //4、断开 socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
//示例三 //服务器 package com.atguigu.tcp2; 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.util.Scanner; import org.junit.Test; public class TestTCP2 { @Test public void server()throws Exception{ //1、创建ServerSocket ServerSocket server = new ServerSocket(9999); while(true){ //2、等待客户端的连接,接收客户端的连接 Socket socket = server.accept(); String clientIp = socket.getInetAddress().getHostAddress(); System.out.println(clientIp+"上线了"); //每一个客户端需要一个线程单独维护它的通信,“同时”与服务器通信的效果 new MessageHandler(socket).start(); } } //和服务器连接上以后,从键盘输入消息,给服务器发送,一直到从键盘输入byebye,在与服务端口连接 @Test public void client()throws Exception{ //1、连接服务器 Socket socket = new Socket("192.168.24.71",9999); OutputStream out = socket.getOutputStream(); //2,从键盘输入给服务器发送 Scanner input = new Scanner(System.in); while(true){ System.out.println("输入要发送的内容:"); String info = input.nextLine(); if("byebye".equals(info)){ break; } //给服务器发送 out.write((info+"\n").getBytes()); } //3、断开 socket.close(); } } class MessageHandler extends Thread{ private Socket socket; public MessageHandler(Socket socket) { super(); this.socket = socket; } public void run(){ try { //3、和一个客户端多次通信,接收到消息后,在控制台打印 InputStream input = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(input); BufferedReader br = new BufferedReader(isr); String str; while((str = br.readLine())!=null){ System.out.println(socket.getInetAddress().getHostAddress() +"说:"+ str); } //4、断开 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } //客户端 package com.atguigu.tcp3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.net.SocketException; import java.util.Scanner; /* * */ public class TestTCPClient{ public static void main(String[] args) throws Exception{ //1、连接服务器 Socket socket = new Socket("192.168.24.71",9090); //2、创建两个线程,一个收,一个发 SendThread send = new SendThread(socket); send.start(); RecevierThread r = new RecevierThread(socket); r.start(); send.join(); r.setExit(true); //3、关闭 socket.close(); } } class SendThread extends Thread{ private Socket socket; public SendThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { OutputStream output = socket.getOutputStream(); PrintStream ps = new PrintStream(output); Scanner input = new Scanner(System.in); while(true){ System.out.println("请输入要发送的内容:"); String info = input.nextLine(); if("bye".equals(info)){ break; } //给服务器发送 ps.println(info); } } catch (IOException e) { e.printStackTrace(); } } } class RecevierThread extends Thread{ private Socket socket; private boolean exit = false; public RecevierThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String str; while(exit==false){ try { str = br.readLine(); } catch (SocketException e) { break; } if(str==null){ break; } System.out.println("收到的消息:" + str); } } catch (IOException e) { e.printStackTrace(); } } public void setExit(boolean exit) { this.exit = exit; } }
标签:java,Socket,编程,网络,new,import,客户端,socket From: https://www.cnblogs.com/woniupa/p/17183670.html