java利用socket实现客户端与服务器的连接与数据传递

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个 socket。socket 也就是套接字,可以用来实现不同虚拟机或者不同计算机之间的通信。在 Java 语言中,socket 可以分为两种类型:面向连接的 socket 通信协议(TCP)和面向无连接的 socket 通信协议(UDP)。任何一个 socket 都是用 IP 地址与端口号唯一确定的。

基于 TCP 的通信过程如下:

首先,服务器端 Listen(监听)指定的某个端口是否有连接请求;其次,客户端想服务器端发出 Connect(连接) 请求;最后,服务器端向客户端返回 Accept(接受) 消息。一个连接就建立起来了,回话随即产生。服务器端与客户端都可以通过 Send,Write 等方法与对方通信。

Socket 的生命周期有三部分:打开 Socket,使用 Socket 收发的数据与关闭 Socket。在 Java  语言中,可以使用 ServerSocket 作为服务器端,Socket 作为客户端来实现网络通信。

这里我们为了简便,把客户端和服务器放到了一个包里面,最好是放在不同的工程里面!

首先我们来看服务器端的代码:

package 网络聊天;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

public class L1{

public L1(){

try{

ServerSocket ss=new ServerSocket(9999);//设置服务器的端口

System.out.println("服务器正在监听");

Socket s=ss.accept();//只有服务器被客户连接之后,才会执行后面的语句

//System.out.println("22");//验证是否连接成功

InputStreamReader isr=new InputStreamReader(s.getInputStream());//接收客户端的数据

BufferedReader br=new BufferedReader(isr);//存入缓存

String xinxi=br.readLine();//读出

System.out.println(xinxi);//打印数据

PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//向客户端传数据

pw.println("我是服务器");//数据是啥

}catch(Exception e){

}

}

public static void main(String args[]){

L1 a=new L1();

}

}

注释比较详细,我就不一一解释了

然后是客户端的代码:

package 网络聊天;

import java.net.*;

import java.io.*;

public class L1_1 {

public static void main(String[] args){

L1_1 a=new L1_1();

}

public L1_1(){

try{

Socket s=new Socket("127.0.0.1",9999);//进入端口,前面是服务器的Ip,自己电脑一般是127.0.0.1,后面的是端口,与服务器对应

PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//IO流发送

pw.println("我是客户端");//发送的内容

//pw.flush();

//s.shutdownInput();

InputStream isr=s.getInputStream();//读取数据

BufferedReader br=new BufferedReader(new InputStreamReader(isr));//存到缓存区

String fanhui=br.readLine();//获取数据

System.out.println(fanhui);//输出数据

}catch(Exception e){

}

}

}

代码都写好之后呢,我们运行一个服务器的代码,启动服务器,console输出如下:


此时服务器正在监听,等待客户端的链接

然后我们运行客户端的代码,与服务器进行连接,此时服务器的终端显示为:


这个表示连接成功啦,服务器接收到了客户端发的数据,然后客户端的终端显示为:


这个表示客户端收到了服务器的数据啦!

还有一个要注意的地方就是我们运行客户端代码的时候,终端会自动切换为客户端的,这个时候要查看服务器的终端则需要切换终端,如上图,点击那个黑色下拉小三角就可以切换啦!

笔者当时运行时没看到服务器的数据输出可把我急坏了,当时一直以为是代码的问题,真的是心塞!!!

好啦,这次就到这里啦,有问题可以和我留言哦!

邮箱:[email protected]

其他博客的链接:

Github个人网站 知乎 

欢迎各位访问哦,这次就到这里啦!

你可能感兴趣的:(java利用socket实现客户端与服务器的连接与数据传递)