Java Socket第一个通讯程序的具体实现及常见问题的分析
2017-01-13 13:05
579 查看
<一>搭建服务器类
服务器的搭建具体分为三个步骤:
a:创建一个服务器套接字,并指定端口号。如: ServerSocket server=new ServerSocket(8888)。 这里的构造方法中的参数就是int port,端口号。这里我们要保证(port>1023),因为前面的端口已经被具体的应用程序占了,如果这里强制port<1023的话,可能会发生一些不可预知的错误。
b:创建一个客户端的实例socket来连接服务器。如: Socket client=server.accept()。在服务器server没有连接到客户端之前,该语句会一直处于阻塞状态。一旦获取到实例,程序往下执行。
c:对连接后实例化的client对象进行信息交流操作。
①获取输入流。 BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
②操作输入流,获取客户端的信息:
特别注意:这里使用完毕输入流的信息之后必须关闭输入流。不然会影响到输出流的信息交换。
③获取输出流。 //get output stream
PrintWriter writer=new PrintWriter(client.getOutputStream())
④操作输出流,向客户端传递消息:
writer.println("hello,Client.I am server");
writer.flush(); ⑤关闭打开的资源,输入输出流和客户端
<二>客户端类的搭建
客户端类的搭建大部分和服务器端类似。
①创建一个Socket用来连接服务器,请求连接。(即被accpet()方法侦听到) Socket client=new Socket("localhost", 8888);//get connection to server;
特别注意:这里localhost为你服务器所在的主机名,我这里的这个demo由于是在自己的电脑上,所以直接用“localhost”(127.0.0.1),客户端的端口和服务器端创建的端口要一致,否则无法连接到。
②建立连接后,可以获取输入输出流,具体方法参见服务器端的介绍。
<三>demo源码
Client.javapackage socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 创建Socket对象,指明需要连接的服务器的地址和端口
* 建立连接后,通过输出流向服务器发送请求信息
* 通过输入流获取服务器的响应信息
* 关闭相应资源
* */
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// TODO Auto-generated method stub
Client client=new Client();
client.onStart();
}
private void onStart() throws UnknownHostException, IOException {
// TODO Auto-generated method stub
Socket client=new Socket("localhost", 8888);//get connection to server;
System.out.pr
bff7
intln("****client connect to server****");
//get output stream first !important
PrintWriter out=new PrintWriter(client.getOutputStream());
BufferedReader inconsole=new BufferedReader(new InputStreamReader(System.in));//input message from console
System.out.println("please input message to server:");
String infoToServer=inconsole.readLine();
while(infoToServer!=null){
out.write(infoToServer);
out.flush();
infoToServer=inconsole.readLine();
// break;
}
System.out.println("send successfully!");
client.shutdownOutput();//close the outputStream
//get input stream
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
String infoFromServer=null;
while((infoFromServer=in.readLine())!=null){
System.out.println("Client get InfoFromServer:"+infoFromServer);
}
//close all
inconsole.close();
in.close();
out.close();
client.close();
}
}
Client.java
服务器的搭建具体分为三个步骤:
a:创建一个服务器套接字,并指定端口号。如: ServerSocket server=new ServerSocket(8888)。 这里的构造方法中的参数就是int port,端口号。这里我们要保证(port>1023),因为前面的端口已经被具体的应用程序占了,如果这里强制port<1023的话,可能会发生一些不可预知的错误。
b:创建一个客户端的实例socket来连接服务器。如: Socket client=server.accept()。在服务器server没有连接到客户端之前,该语句会一直处于阻塞状态。一旦获取到实例,程序往下执行。
c:对连接后实例化的client对象进行信息交流操作。
①获取输入流。 BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
②操作输入流,获取客户端的信息:
//get input stream BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); String infoFromClient=null; while((infoFromClient=in.readLine())!=null){ System.out.println("Server get InfoFromClient:"+infoFromClient);//print the information from client } client.shutdownInput();//close input stream !Important
特别注意:这里使用完毕输入流的信息之后必须关闭输入流。不然会影响到输出流的信息交换。
③获取输出流。 //get output stream
PrintWriter writer=new PrintWriter(client.getOutputStream())
④操作输出流,向客户端传递消息:
writer.println("hello,Client.I am server");
writer.flush(); ⑤关闭打开的资源,输入输出流和客户端
writer.close(); in.close(); client.close();
<二>客户端类的搭建
客户端类的搭建大部分和服务器端类似。
①创建一个Socket用来连接服务器,请求连接。(即被accpet()方法侦听到) Socket client=new Socket("localhost", 8888);//get connection to server;
特别注意:这里localhost为你服务器所在的主机名,我这里的这个demo由于是在自己的电脑上,所以直接用“localhost”(127.0.0.1),客户端的端口和服务器端创建的端口要一致,否则无法连接到。
②建立连接后,可以获取输入输出流,具体方法参见服务器端的介绍。
<三>demo源码
Client.javapackage socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 创建Socket对象,指明需要连接的服务器的地址和端口
* 建立连接后,通过输出流向服务器发送请求信息
* 通过输入流获取服务器的响应信息
* 关闭相应资源
* */
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// TODO Auto-generated method stub
Client client=new Client();
client.onStart();
}
private void onStart() throws UnknownHostException, IOException {
// TODO Auto-generated method stub
Socket client=new Socket("localhost", 8888);//get connection to server;
System.out.pr
bff7
intln("****client connect to server****");
//get output stream first !important
PrintWriter out=new PrintWriter(client.getOutputStream());
BufferedReader inconsole=new BufferedReader(new InputStreamReader(System.in));//input message from console
System.out.println("please input message to server:");
String infoToServer=inconsole.readLine();
while(infoToServer!=null){
out.write(infoToServer);
out.flush();
infoToServer=inconsole.readLine();
// break;
}
System.out.println("send successfully!");
client.shutdownOutput();//close the outputStream
//get input stream
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
String infoFromServer=null;
while((infoFromServer=in.readLine())!=null){
System.out.println("Client get InfoFromServer:"+infoFromServer);
}
//close all
inconsole.close();
in.close();
out.close();
client.close();
}
}
Client.java
package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /* 服务器端 a)、创建ServerSocket对象绑定监听端口。 b)、通过accept()方法监听客户端的请求。 c)、建立连接后,通过输入输出流读取客户端发送的请求信息。 d)、通过输出流向客户端发送请求信息。 e)、关闭相关资源。 author:zipple;2017-1-13 bug:服务器端无法发送请求到客户端 * */ public class Server { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Server server=new Server(); server.onStart(); } private void onStart() throws IOException { System.out.println("*************loading****************"); ServerSocket serverSocket=new ServerSocket(8888);//new a server System.out.println("server started successfully,wait for client..."); Socket client = serverSocket.accept();//get connection //get input stream BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); String infoFromClient=null; while((infoFromClient=in.readLine())!=null){ System.out.println("Server get InfoFromClient:"+infoFromClient);//print the information from client } client.shutdownInput();//close input stream !Important //get output stream PrintWriter writer=new PrintWriter(client.getOutputStream()); writer.println("hello,Client.I am server"); writer.flush(); writer.close(); in.close(); client.close(); } }
相关文章推荐
- 微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)
- dwr实现javaweb实时聊天通讯网页版常见问题及解决方案
- 第一个java网络程序,有客户端和服务器端,用socket实现
- Java基础_第一个程序《HelloWorld》及常见问题解决
- java swing实现简单的socket通讯聊天程序源码
- 微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)
- linux下使用jni实现c++调用java程序(2)找不到java类的问题
- Java调用外部程序命令时线程阻塞问题分析
- 程序终于实现跨机器运行——记VC++2005程序开发的一个常见问题
- 常见问题 之 win32平台下用C开发Socket程序
- java.net.SocketException: Too many open files问题分析及解决方案
- 关于用socket通讯来实现远程的程序调用
- Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现(方案三)
- java学习笔记---第一个applet程序以及一个小问题的解决
- 用java写的基于Socket的简单即时通讯程序
- JAVA程序内存溢出问题的分析
- Socket通讯编程实现简单的任意聊天程序
- JAVA视频教程,学习JAVA常见问题分析-JAVA学习方法系列
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现(方案二)