一、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();
}
}

}



}