您的位置:首页 > 理论基础 > 计算机网络

网络通信(Server和Client)

2017-06-10 21:57 393 查看

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) {

4000
// 读
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();
} // 等!!!
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: