一、osi网络7层架构
ip:网络唯一标识。(internet protocol address)网络互联协议地址。分为网络地址和主机地址。
port:端口号,每一个网络应用程序都需要一个以上的端口号。(1-65535)。1000以内的不要用。
osi7层架构
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
tcp协议(传输控制协议),保证两个应用程序之间可靠的网络通信。可靠的,低效的。
telent ftp smtp等
udp协议(用户数据报文协议)。面向无连接的不可靠的,高效的。
qq snmp dns 在线视频
二、socket简介
套接字,用于描述一个ip和端口号绑定的通信会话(socket连接)。每一个网络服务都会打开一个socket连接。
serverSocket
位于java的net包下面。
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
三、基于TCP协议的socket编程
创建一个基于tcp协议的scoket服务器
类 ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
public class TalkServer { public static void main(String[] args) throws Exception { //创建一个serversocket在端口7000上,监听客户端请求 ServerSocket server= new ServerSocket(7000); Socket socket = server.accept();//获取socket对象 //由Scoket对象获得输入流,并构造相应的bufferedReader对象 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //由socket对象得到输出流,并构造printWrite对象 PrintWriter os = new PrintWriter(socket.getOutputStream(), true); //由控制台输入构造BufferedReader对象 BufferedReader sin= new BufferedReader(new InputStreamReader(System.in)); System.out.println(“client:”+in.readLine());//打印客户端消息 String line = sin.readLine();//从控制台读取输入消息 while(!line.equals(“bye”)){ //把line返回给client os.println(line); System.out.println(“server:”+line); System.out.println(“client:”+in.readLine()); line=sin.readLine();//读取下一条消息
} in.close(); os.close(); sin.close(); socket.close(); }
}
使用多线程技术完成多服务对多客户端
package com.aaa.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class TalkServerThread implements Runnable {
private Socket socket; public TalkServerThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { //由Scoket对象获得输入流,并构造相应的bufferedReader对象 BufferedReader in; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //由socket对象得到输出流,并构造printWrite对象 PrintWriter os = new PrintWriter(socket.getOutputStream(), true); //由控制台输入构造BufferedReader对象 BufferedReader sin= new BufferedReader(new InputStreamReader(System.in)); System.out.println("client:"+in.readLine());//打印客户端消息 String line = sin.readLine();//从控制台读取输入消息 while(!line.equals("bye")){ //把line返回给client os.println(line); System.out.println("server:"+line); System.out.println("client:"+in.readLine()); line=sin.readLine();//读取下一条消息 } in.close(); os.close(); sin.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
测试类
package com.aaa.tcp; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiSocketServerTest {
/** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //多个socket连接,但是端口号一致 ServerSocket server=new ServerSocket(7000); Socket socket=null; while(true){ socket = server.accept();//等待获取来自客户端的socket请求 //一旦客户端请求到达,开启一个线程,来跟客户端交互 new Thread(new TalkServerThread(socket)).start(); } }
}
四、基于UDP协议的socket编程
InetAddress public static void main(String[] args) throws Exception { InetAddress localHost = InetAddress.getLocalHost(); String hostName = localHost.getHostName(); System.out.println(hostName); String hostAddress = localHost.getHostAddress(); System.out.println(hostAddress);
//获取远程网站的ip InetAddress baidu = InetAddress.getByName("www.baidu.com"); System.out.println(baidu.getHostAddress()); }
使用upd模拟飞秋发送消息
package com.aaa.network; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Date; /**
- @author sunshaoshan
- @description java 模拟飞秋发送消息
- @company AAA软件
- 2018-11-5下午4:45:53
*/ public class FeiQiuTest { /** *TODO *@param args *2018-11-5下午4:45:45 */ public static void main(String[] args) { DatagramSocket ds= null; DatagramPacket dp = null; InetAddress localHost; String Version=“1_lbt4_0#128#000C29D68D8F#0#0#0#2.5a”; Long id=new Date().getTime();//获取当前系统毫秒 String user=“孙韶山”; String host=“sunshaoshan”; //long IPMSG_SENDMSG = 0x00000020;//发消息 long IPMSG_SENDMSG = 209;//发消息 String msg=“I kill you!”; while(true){
try { ds=new DatagramSocket(); //localHost = InetAddress.getByName("DESKTOP-H5URIFQ"); localHost=InetAddress.getLocalHost(); String message=Version+":"+id+":"+user+":"+host+":"+IPMSG_SENDMSG+":"+msg; //封装数据报文,2425是飞秋的端口号 ///1version(IPMSG版本):no(消息编号,可以用系统时间):user(发送消息的用户名):host(发送消息的主机名):command(上述Command常量,可以用|组合多个值):msg(消息内容) byte[] buff= message.getBytes("gbk"); dp = new DatagramPacket(buff, buff.length,localHost,2425); //发送报文 ds.send(dp); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
- }
}