1. OSI结构
OSI模型 数据单位 | 协议 |
---|---|
应用层 | 应用软件 |
表示层 | 解析 |
会话层 | 建立通道 |
传输层 | 段 传输和端口号 |
网络层 | 数据包(路由器) |
链路层 | 帧 (frame交换机) mac地址的(解)封装 |
物理层 | 比特(bit,网线) 物理设备,1 0比特流 |
1. TCP : 可靠的,,,三次握手,进行数据传输
2. UDP : 不可靠,,,
具体可以参考
http://blog.csdn.net/libaineu2004/article/details/39829889
2.Tcp Socket通信
- Socket:套接字是基于tcp协议的
- 标识一个网络地址 www.baidu.com
- 主机名 ::www.c
3.控制台流获取方式
控制台输入流 : 字符流=字节流 [+码表 +缓存]
InputStream in2 = System.in; // 字节流
InputStreamReader isr = new InputStreamReader(in2);
BufferedReader br = new BufferedReader(isr);
4.客户端与服务器通信
客户端(四步)
- 有一个socket:最好是指定ip,端口
- 获取到输出流
- 写数据
- 关流 关socket就可以了!
服务端代码
public class Server {
public static void main(String[] args) {
String strRead;
String strwrite;
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(9090);
socket = serverSocket.accept();
System.out.println("有人来了");
// 读取控制台
InputStream in2 = System.in; // 字节流
InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
BufferedReader br = new BufferedReader(isr);
InputStream inputStream = socket.getInputStream();// 输入流
OutputStream outputStream = socket.getOutputStream();// j输出流
while (true) {
// 读
byte[] b = new byte[1024];
int length = inputStream.read(b);// s
strRead = new String(b, 0, length);
System.out.println(strRead);
if ("Bye".equals(strRead)) {
break;
}
// 写
String str = br.readLine();
outputStream.write(str.getBytes());
if ("Bye".equals(str)) {
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
serverSocket.close();
System.out.println("serverSocket.close();");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
客户端代码
public class Client {
public static void main(String[] args) {
String strRead = "";
Socket socket = null;
try {
InputStream in2 = System.in; // 字节流
InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
BufferedReader br = new BufferedReader(isr);
socket = new Socket("localhost", 9090);
InputStream inputStream = socket.getInputStream();// 输入流
OutputStream outputStream = socket.getOutputStream();// j输出流
// String content = "你好啊,我是客户端,你是";
// outputStream.write(content.getBytes());
// 读数据
while (true) {
// 写
String str = br.readLine();
outputStream.write(str.getBytes());
if ("Bye".equals(str)) {
break;
}
// 读
byte[] b = new byte[1024];
int length = inputStream.read(b);// s
strRead = new String(b, 0, length);
System.out.println(strRead);
if ("Bye".equals(strRead)) {
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
System.out.println("socket.close();");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
服务器(四步)
- serversocket
- 开始接受客户端(干活)
- 已经有socket1,拿到输入流
- 关闭:先关闭所有socket然后关闭serversoc public class Servepublic static
}
多个客户端与服务器通信
注意端口占用问题
服务端代码
public class Server {
public static void main(String[] args) {
System.out.println("服务器开启!");
try {
ServerSocket serverSocket = new ServerSocket(9090);
while (true) {
Socket socket = serverSocket.accept();//
ServerThread serverThread = new ServerThread(socket);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class ServerThread implements Runnable {
Socket socket;
ServerSocket serverSocket = null;
/** 生成流 **/
InputStream inputStream = null;// 输入流
OutputStream outputStream = null;// 输出流
// 读取控制台
InputStream in2 = System.in;// 字节流
InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
BufferedReader br = new BufferedReader(isr);
/** 客户端交互 **/
String receive = "";
String send = "";
public ServerThread(Socket socket) {
this.socket = socket;
try {
outputStream = socket.getOutputStream();// 输出流
inputStream = socket.getInputStream();// 输入流
new Thread(this).start();
while (true) {
send = br.readLine();
outputStream.write(send.getBytes());
if ("bye".equals(receive)) {
break;
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
public void run() {
while (true) {
// 读客户端的消息:等!!!
byte[] b = new byte[1024];
int length;
try {
length = inputStream.read(b);
receive = new String(b, 0, length);
System.out.println("receive:" + receive);
if ("bye".equals(receive)) {
break;
}
System.out.println("请回复客户端:");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 等!!!
}
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 9090);
ClientThread clientThread = new ClientThread(socket);
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class ClientThread implements Runnable {
Socket socket;
// ServerSocket serverSocket = null;
/** 生成流 **/
InputStream inputStream = null;// 输入流
OutputStream outputStream = null;// j输出流
// 读取控制台
InputStream in2 = System.in;// 字节流
InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
BufferedReader br = new BufferedReader(isr);
/** 客户端交互 **/
String receive = "";
String send = "";
public ClientThread(Socket socket) {
this.socket = socket;
try {
outputStream = socket.getOutputStream();// j输出流
inputStream = socket.getInputStream();// 输入流
new Thread(this).start();
while (true) {
send = br.readLine();
outputStream.write(send.getBytes());
if ("bye".equals(receive)) {
break;
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
public void run() {
while (true) {
// 读客户端的消息:等!!!
byte[] b = new byte[1024];
int length;
try {
length = inputStream.read(b);
receive = new String(b, 0, length);
System.out.println("receive:" + receive);
if ("bye".equals(receive)) {
break;
}
System.out.println("请回复客户端:");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 等!!!
}
}
}