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输出如下:

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

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

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

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

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

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

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

邮箱:2321591758@qq.com

其他博客的链接:

Github个人网站      知乎      简书

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

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值