是不是看了许多socket入门知识,却还是不能实际运用呢,这篇文章通过利用简单实例程序讲解通过socket实现客户端与服务器之间的通讯。这篇文章可以让你不需要了解socket原理也能利用,便于应急,但建议之后要好好补补关于soket的基础知识。
首先就是上代码,先是服务器端代码SocketServerDemo.java,里面已经有详细注释。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServerDemo {
private ServerSocket serverSocket;
public SocketServerDemo(){
try{
//设置你服务器监听的端口为10000,用户能使用的端口为1025-65535
serverSocket = new ServerSocket(10000);
}catch(IOException e){
//捕获异常,不懂的话好好看java,
e.printStackTrace();
}
//创建新的监听主线程,这个线程创建ServerSocket监听
new Thread(new Runnable(){
public void run(){
while(true){
Socket socket = null;
try{
socket = serverSocket.accept();
//当监听到了客户端连接后,创建新线程传输数据,这样可以实现多个客户端同时访问
new Thread(new SocketHandler(socket)).start();
}catch(Exception e){
e.printStackTrace();
}
}
}
}).start();
}
class SocketHandler implements Runnable{
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
SocketHandler(Socket socket){
try{
this.socket = socket;
reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(),"GB2312"));
writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("-------welcome---------");
writer.println("-------welcome---------");
writer.println("-------welcome---------");
}catch(IOException e){
e.printStackTrace();
}
}
//这里是覆盖实现接口Runnable里的run()
public void run(){
try{
//读取数据,这里只能读取一行String
String line = reader.readLine();
System.out.println(line);
}catch(IOException e){e.printStackTrace();}finally{
//最后要关闭Socket
try{
if(socket!=null)socket.close();
if(reader!=null)reader.close();
if(writer!=null)writer.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
new SocketServerDemo();
}
}
客户端代码SocketClientDemo.java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class SocketClientDemo implements Runnable{
private Socket socket;
BufferedReader reader;
private PrintWriter writer;
public SocketClientDemo(){
try{
//127.0.0.1表示本机IP,10000为服务器Socket设置的端口
socket = new Socket("127.0.0.1", 10000);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GB2312"));
writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("working.............");
}catch(IOException e){
e.printStackTrace();
}
}
public void run(){
try{
//这里就可以读取所有行String
String line, buffer="";
while(!((line = reader.readLine())==null))
buffer+=line;
System.out.println(buffer);
}catch(IOException e){
e.printStackTrace();
System.out.println("problem");
}finally{
//最后关闭Socket
try{
if(socket!=null)socket.close();
if(reader!=null)reader.close();
if(writer!=null)writer.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args){
new Thread(new SocketClientDemo()).start();
}
}
测试:
可以在同一台电脑上打开两个cmd进行测试,客户端Socket的ip填127.0.0.1,下面介绍在用两台在同一个局域网内的电脑进行测试,这里的区别就是ip怎么填,在作为服务器的电脑中执行以下步骤查找本机在局域网内的ip:
打开“打开网络和共享中心”,点击“”更改适配器设置”,找到正在使用的网卡,点击右键,然后点击“状态”,点击“详细信息”,IPv4地址就是本机在局域网内的地址。
或者在cmd上输入ipconfig,找到正在使用的网卡的ip。
如何通过外网ip访问服务器,首先查询本机的外网ip可以在百度里面输入ip即可看到本机的外网ip,于是同学们把这ip输入到客户端Socket中,编译,运行,不行。。。。。你可以查下在局域网内所有的电脑的外网ip,发现他们外网ip竟然相同,学过计算机网络的知道,局域网中的主机是共享外网ip的。那怎么实现不在局域网的两台电脑之间的通讯呢,这样就要你的电脑有自己的外网ip,我的做法是申请一个云服务器,腾讯云,阿里云,每台服务器都有唯一的外网ip,自己去玩吧。第一篇博客就到这里了。