在网络通讯中,想要进行数据传输就要先找到对方的IP(ip地址的每个段取值为0-255)地址,然后项数据发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)。在这里的端口并不是计算机外面的硬件接口,而是应用程序与外界交流的出入口,它是一种抽象的软件结构。同时在数据传输是,计算机之间相互定义了通讯规则,这个通讯规则称之为协议,国际组织定义了通用的通讯规则TCP/IP。
在网络编程中存在两种网络模型,分别为:OSI参考模型和TCP/IP参考模型。OSI参考模型:国际标准化组织ISO于l978年提出“开放系统互连参考模型”,该模型把计算机网络分成物理层、数据链路层、网络层、传输层、会话层、表示层、应用层等七层。TCP/IP参考模型:后期出现的更简单的模型,它是OSI的简化版,它将OSI参考模型中的应用层表示层和会话层封装为应用层,将数据链路层与物理层封装为主机至网络层。两种参考模型关系如下:
UDP:1.将数据及源和目的封装成数据包中,不需要建立连接。
2.每个数据报包的大小在限制在64k内。
3.因无连接,是不可靠的协议。
4.不需要建立连接,速度快。
应用:传输视频,桌面共享,聊天 等 追求速度 的情况下用 UDP。
TCP:1.建立连接,形成传输数据的通道。
2.在连接中进行大数据传输。
3.通过三次握手完成连接,是可靠协议。
4.因为必须建立连接,所以效率会稍低。
主要用于数据下载,文件传输,可靠性要求高的应用
在网络编程中有一个十分重要的概念:Socket。所谓的网络编程其实指的就是Socket编程。Socket就是为网络服务提供的一种机制,通信的两端都有Socket时,网络通信就是Socket间的通信,数据在两个Socket之间通过IO传输。Socket可以使用UDP和TCP这两种协议建立端口。Socket网络变成主要是编写服务端和客户端,其基本步骤如下:
服务端编写步骤:
1. 利用ServerSocket建立对服务端某个端口的监听;
如: ServerSocket serverSocket = new ServerSocket(8000);
2. 利用accept方法创建服务端Socket;
如: Socket socket = serverSocket.accept();
3. 利用建立的Socket创建输入输出流;
如: BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream(), true);
4. 关闭输出流、关闭Socket、关闭ServerSocket;
如: br.close();
ps.close();
socket.close();
serverSocket.close();
客户端编写步骤:
1. 创建客户端Socket向服务端发起的连接请求;
如: Socket socket = new Socket("127.0.0.1", 8000);
2. 利用已建立的Socket创建输出流;
如: BufferedReader br = new BufferedReader( new InputSreamReader(socket.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
3. 关闭输出流、关闭socket;
如: br.close();
pw.close();
socket.close();
示例:客户端通过键盘录入用户名,服务端对这个用户名进行校检。如果该用户存在,在服务端显示xxx,已登录。并在客户端显示xxx,欢迎光临。如果该用户名不存在,在服务端显示xxx,尝试登陆。并在客户端显示xxx,该用户名不存在。最多登陆三次
import java.net.*;
class LoqinClient
{
public static void main (string[] args) thros Exception //客户端
{
Sock s = new Socket("192.168.1.254",10008);
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));PrintWriter out = new PrintWriter(s.getoutputStream(),true);
BufferedReader bufIn =new BufferedReader(new InputStreamReader(s.getStream());
for(int x=0;x<3;x++)
{String line = bufr.readerLine();
if(line==ull)
break;
out.printlin(line);
String info =bufIn.readerLine();
System.out.print("info:"+info);if(info.contains("欢迎"))
break;}
bufr.close();
s.close();
}}
class UserThread implement Runable //每个客户端线程代码
{
private Socket s;
UserThread(Socket s)
{this s = s;
}
public viod run()
{String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
try{
for(int x=0;x<3;x++) //只校验三次
{
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedReader bufr =new BufferedReader(new(FileReader("xxx.txt"))) //读取已注册的用户名
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;boolean flag = false;
while((line=bufr.readLine())!=null){
if(line.equals(name))
{
flag = true;
break;
}
else
{
System.out.println(name+",尝试登陆");
out.println(name+“,用户名不存在”);
}}
if(flag)
{
System.out.println(name+",已登录");
out.println(name+",欢迎光临");
}}
s.close();
}
catch(Exception e)
{
throw RuntimeException(ip+"校验失败");
}
}
}
class LoqinServer //服务端
{
public static void main (string[] args) throws Exception
{
ServerSocket ss = new ServerSocket (10008);
while(true)
{Socket s = ss.accept();
new Thread(new UserThread(s).start()) //服务端只有一个 客户端有多个因此使用多线程技术
}
}
}
通过上述示例可以充分理解服务端和客户端的编写过程,在面试过程中还会配合java的GUI(图形化界面)一起考核,如制作一个客户端的登陆页面与之一起作为一道面试题,因此在实际应用时知识总是能够相互联系的,我们应重视每一部分,不能出现“重点”知识,应该把知识都学会学好。