Java基于TCP协议的网络编程功能怎么实现
本篇内容介绍了“Java基于TCP协议的网络编程功能怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、单向通信功能:客户端发送一句话到服务器:
客户端:
publicclassTestClient{//客户端//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args)throwsIOException{//1.创建套接字:指定服务器的ip和端口号:Sockets=newSocket("192.168.199.217",8888);//2.对于程序员来说,向外发送数据感受--》利用输出流:OutputStreamos=s.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);//利用这个OutputStream就可以向外发送数据了,但是没有直接发送String的方法//所以我们又在OutputStream外面套了一个处理流:DataOutputStreamdos.writeUTF("你好");//3.关闭流+关闭网络资源:dos.close();os.close();s.close();}}
服务器端:
publicclassTestServer{//服务器//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args)throwsIOException{//1.创建套接字:指定服务器的端口号ServerSocketss=newServerSocket(8888);//2.等着客户端发来的信息:Sockets=ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:InputStreamis=s.getInputStream();DataInputStreamdis=newDataInputStream(is);//4.读取客户端发来的数据:Stringstr=dis.readUTF();System.out.println("客户端发来的数据为:"+str);//5.关闭流+关闭网络资源:dis.close();is.close();s.close();ss.close();}}
测试:
先开启客户端还是先开启服务器:先开服务器,再开启客户端 侧面验证:先开客户端:出错。
如图:
客户端:
importjava.io.*;importjava.net.Socket;publicclassTestClient{//客户端//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args)throwsIOException{//1.创建套接字:指定服务器的ip和端口号:Sockets=newSocket("192.168.199.217",8888);//2.对于程序员来说,向外发送数据感受--》利用输出流:OutputStreamos=s.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);//利用这个OutputStream就可以向外发送数据了,但是没有直接发送String的方法//所以我们又在OutputStream外面套了一个处理流:DataOutputStreamdos.writeUTF("你好");//接收服务器端的回话--》利用输入流:InputStreamis=s.getInputStream();DataInputStreamdis=newDataInputStream(is);Stringstr=dis.readUTF();System.out.println("服务器端对我说:"+str);//3.关闭流+关闭网络资源:dis.close();is.close();dos.close();os.close();s.close();}}
服务器端:
importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassTestServer{//服务器//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args)throwsIOException{//1.创建套接字:指定服务器的端口号ServerSocketss=newServerSocket(8888);//2.等着客户端发来的信息:Sockets=ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:InputStreamis=s.getInputStream();DataInputStreamdis=newDataInputStream(is);//4.读取客户端发来的数据:Stringstr=dis.readUTF();System.out.println("客户端发来的数据为:"+str);//向客户端输出一句话:---》操作流---》输出流OutputStreamos=s.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF("你好,我是服务器端,我接受到你的请求了");//5.关闭流+关闭网络资源:dos.close();os.close();dis.close();is.close();s.close();ss.close();}}
三、对象流传送注意:关闭防火墙
封装的User类:
importjava.io.Serializable;publicclassUserimplementsSerializable{privatestaticfinallongserialVersionUID=9050691344308365540L;privateStringname;privateStringpwd;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetPwd(){returnpwd;}publicvoidsetPwd(Stringpwd){this.pwd=pwd;}publicUser(Stringname,Stringpwd){this.name=name;this.pwd=pwd;}}
客户端:
importjava.io.*;importjava.net.Socket;importjava.util.Scanner;publicclassTestClient{//客户端//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args)throwsIOException{//1.创建套接字:指定服务器的ip和端口号:Sockets=newSocket("192.168.199.217",8888);//录入用户的账号和密码:Scannersc=newScanner(System.in);System.out.println("请录入您的账号:");Stringname=sc.next();System.out.println("请录入您的密码:");Stringpwd=sc.next();//将账号和密码封装为一个User的对象:Useruser=newUser(name,pwd);//2.对于程序员来说,向外发送数据感受--》利用输出流:OutputStreamos=s.getOutputStream();ObjectOutputStreamoos=newObjectOutputStream(os);oos.writeObject(user);//接收服务器端的回话--》利用输入流:InputStreamis=s.getInputStream();DataInputStreamdis=newDataInputStream(is);booleanb=dis.readBoolean();if(b){System.out.println("恭喜,登录成功");}else{System.out.println("对不起,登录失败");}//3.关闭流+关闭网络资源:dis.close();is.close();oos.close();os.close();s.close();}}
服务器:
importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassTestServer{//服务器//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{//1.创建套接字:指定服务器的端口号ServerSocketss=newServerSocket(8888);//2.等着客户端发来的信息:Sockets=ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:InputStreamis=s.getInputStream();ObjectInputStreamois=newObjectInputStream(is);//4.读取客户端发来的数据:Useruser=(User)(ois.readObject());//对对象进行验证:booleanflag=false;if(user.getName().equals("娜娜")&&user.getPwd().equals("123123")){flag=true;}//向客户端输出结果:---》操作流---》输出流OutputStreamos=s.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeBoolean(flag);//5.关闭流+关闭网络资源:dos.close();os.close();ois.close();is.close();s.close();ss.close();}}四、加入完整的处理异常方式
服务器端:
importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassTestServer{//服务器//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args){//1.创建套接字:指定服务器的端口号ServerSocketss=null;Sockets=null;InputStreamis=null;ObjectInputStreamois=null;OutputStreamos=null;DataOutputStreamdos=null;try{ss=newServerSocket(8888);//2.等着客户端发来的信息:s=ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//accept()返回值为一个Socket,这个Socket其实就是客户端的Socket//接到这个Socket以后,客户端和服务器才真正产生了连接,才真正可以通信了//3.感受到的操作流:is=s.getInputStream();ois=newObjectInputStream(is);//4.读取客户端发来的数据:Useruser=(User)(ois.readObject());//对对象进行验证:booleanflag=false;if(user.getName().equals("娜娜")&&user.getPwd().equals("123123")){flag=true;}//向客户端输出结果:---》操作流---》输出流os=s.getOutputStream();dos=newDataOutputStream(os);dos.writeBoolean(flag);}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}finally{//5.关闭流+关闭网络资源:try{if(dos!=null){dos.close();}}catch(IOExceptione){e.printStackTrace();}try{if(os!=null){os.close();}}catch(IOExceptione){e.printStackTrace();}try{if(ois!=null){ois.close();}}catch(IOExceptione){e.printStackTrace();}try{if(is!=null){is.close();}}catch(IOExceptione){e.printStackTrace();}try{if(s!=null){s.close();}}catch(IOExceptione){e.printStackTrace();}try{if(ss!=null){ss.close();}}catch(IOExceptione){e.printStackTrace();}}}}
客户端:
importjava.io.*;importjava.net.Socket;importjava.util.Scanner;publicclassTestClient{//客户端//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args){//1.创建套接字:指定服务器的ip和端口号:Sockets=null;OutputStreamos=null;ObjectOutputStreamoos=null;InputStreamis=null;DataInputStreamdis=null;try{s=newSocket("192.168.199.217",8888);//录入用户的账号和密码:Scannersc=newScanner(System.in);System.out.println("请录入您的账号:");Stringname=sc.next();System.out.println("请录入您的密码:");Stringpwd=sc.next();//将账号和密码封装为一个User的对象:Useruser=newUser(name,pwd);//2.对于程序员来说,向外发送数据感受--》利用输出流:os=s.getOutputStream();oos=newObjectOutputStream(os);oos.writeObject(user);//接收服务器端的回话--》利用输入流:is=s.getInputStream();dis=newDataInputStream(is);booleanb=dis.readBoolean();if(b){System.out.println("恭喜,登录成功");}else{System.out.println("对不起,登录失败");}}catch(IOExceptione){e.printStackTrace();}finally{//3.关闭流+关闭网络资源:try{if(dis!=null){dis.close();}}catch(IOExceptione){e.printStackTrace();}try{if(is!=null){is.close();}}catch(IOExceptione){e.printStackTrace();}try{if(oos!=null){oos.close();}}catch(IOExceptione){e.printStackTrace();}try{if(os!=null){os.close();}}catch(IOExceptione){e.printStackTrace();}try{if(s!=null){s.close();}}catch(IOExceptione){e.printStackTrace();}}}}五、多线程接收用户请求
问题:
服务器针对一个请求服务,之后服务器就关闭了(程序自然结束了)
需要解决:
服务器必须一直在监听 ,一直开着,等待客户端的请求
在当前代码中,客户端不用动了
更改服务器代码:
服务器线程:
importjava.io.*;importjava.net.Socket;publicclassServerThreadextendsThread{//线程:专门处理客户端的请求InputStreamis=null;ObjectInputStreamois=null;OutputStreamos=null;DataOutputStreamdos=null;Sockets=null;publicServerThread(Sockets){this.s=s;}@Overridepublicvoidrun(){try{//2.等着客户端发来的信息:is=s.getInputStream();ois=newObjectInputStream(is);//4.读取客户端发来的数据:Useruser=(User)(ois.readObject());//对对象进行验证:booleanflag=false;if(user.getName().equals("娜娜")&&user.getPwd().equals("123123")){flag=true;}//向客户端输出结果:---》操作流---》输出流os=s.getOutputStream();dos=newDataOutputStream(os);dos.writeBoolean(flag);}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}finally{try{if(dos!=null){dos.close();}}catch(IOExceptione){e.printStackTrace();}try{if(os!=null){os.close();}}catch(IOExceptione){e.printStackTrace();}try{if(ois!=null){ois.close();}}catch(IOExceptione){e.printStackTrace();}try{if(is!=null){is.close();}}catch(IOExceptione){e.printStackTrace();}}}}
服务器端:
importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassTestServer{//服务器//这是一个main方法,是程序的入口:publicstaticvoidmain(String[]args){System.out.println("服务器启动了");//1.创建套接字:指定服务器的端口号ServerSocketss=null;Sockets=null;intcount=0;//定义一个计数器,用来计数客户端的请求try{ss=newServerSocket(8888);while(true){//加入死循环,服务器一直监听客户端是否发送数据s=ss.accept();//阻塞方法:等待接收客户端的数据,什么时候接收到数据,什么时候程序继续向下执行。//每次过来的客户端的请求靠线程处理:newServerThread(s).start();count++;//输入请求的客户端的信息:System.out.println("当前是第"+count+"个用户访问我们的服务器,对应的用户是:"+s.getInetAddress());}}catch(IOExceptione){e.printStackTrace();}}}
“Java基于TCP协议的网络编程功能怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。