天天看点

Java网络编程TCP 、建立Socket连接,客户端和服务端基本数据传输

1.Java网络编程——建立Socket连接

基于Tcp协议的编程:

服务端和客户端

服务端:创建ServerSocket对象,绑定要监听的端口。

客户端:创建Socket(网络套接字),给出要访问的服务端ip,以及端口号port。

下面给出一段代码演示

服务端代码示例

package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mysever {

	public static void main(String[] args) throws IOException {
		
		//建立服务端对象,绑定4574端口。
		 ServerSocket serv =new ServerSocket(4574);
		 
		 System.out.println("服务器启动成功,等待用户接入");
		  
		 //accept()等待用户接入,如果没有用户连接,会一直等待。
		 //有客户连接后,accept()方法会返回一个Socket对象,代表客户端
		 Socket sc=serv.accept();
		 
		 System.out.println("有客户端接入,客户端ip:"+sc.getInetAddress());
	}
}
           

客户端代码示例

package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mysever {

	public static void main(String[] args) throws IOException {
		
		//建立服务端对象,绑定4574端口。
		 ServerSocket serv =new ServerSocket(4574);
		 
		 System.out.println("服务器启动成功,等待用户接入");
		  
		 //accept()等待用户接入,如果没有用户连接,会一直等待。
		 //有客户连接后,accept()方法会返回一个Socket对象,代表客户端
		 Socket sc=serv.accept();
		 
		 System.out.println("有客户端接入,客户端ip:"+sc.getInetAddress());
	}
}
           

先运行服务端代码,再运行客户端代码。

运行服务端(客户端还未运行)

服务器启动成功,等待用户接入

运行客户端

服务器启动成功,等待用户接入

有客户端接入,客户端ip:/192.168.0.104

切换到服务端控制窗口

服务端结果

服务器启动成功,等待用户接入

有客户端接入,客户端ip:/192.168.0.104

2.Socket基本流数据传输(客户端和服务端进行数据传输的基本操作)

getInputStream():返回网络输入流InputStream,可以接收来自网络的数据

getOutputStream():返回值为网络输出流 OutputStream,可以将数据发送到网络上

write(byte[]):写

read(byte[]):读

服务端代码

package server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Mysever {

	public static void main(String[] args) throws IOException {
		
		//建立服务端对象,绑定4574端口。
		 ServerSocket serv =new ServerSocket(4574);
		 
		 System.out.println("服务器启动成功,等待用户接入");
		  
		 //accept()等待用户接入,如果没有用户连接,会一直等待。
		 //有客户连接后,accept()方法会返回一个Socket对象,代表客户端
		 Socket sc=serv.accept();
		 
		 System.out.println("有客户端接入,客户端ip:"+sc.getInetAddress());
		 
		 //从Socket中得到网络输入流,接收来自网络的数据
		 InputStream in=sc.getInputStream();
		 //从Socket中得到网络输出流,将数据发送到网络上
		 OutputStream out=sc.getOutputStream();
	
		 //接收客户端发来的数据
		 byte[] bs=new byte[1024];
		 //将数据存入bs数组中,返回值为数组的长度
		 int len=in.read(bs);
		 String str=new String(bs,0,len);
		 System.out.println("来自客户端的消息: "+str);
		 
		 //向客户端写数据,注意客户端代码中别忘记写read()方法,否则会抛异常
		 out.write("欢迎访问,你好,我是服务端".getBytes());	 
		 System.out.println("服务端正常结束");
		 
		 //关闭流!
		 sc.close();		 
	}
}
           

客户端代码

package cli;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 下面编写客户端,此时,不需要关心客户端地址。
 * 只需要关心服务端ip地址,这样才能连接服务器。
 * 服务端的端口号也需要知道。
 * 
 */
public class MyClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		//建立Socket连接,new Socket(服务端ip,端口port);
		Socket so=new Socket("192.168.0.104",4574);
		
		System.out.println("连接服务器成功");
		
	   //从Socket中得到网络输入流,接收来自网络的数据
		InputStream in=so.getInputStream();
	   //从Socket中得到网络输出流,将数据发送到网络上
		OutputStream out=so.getOutputStream();
		
		//write方法中只能为byte[],或者int。
		//若服务端没有read(),则客户端会一直等。即停留在write方法中。
		out.write("你好,我是客户端".getBytes());
		
		 //接收服务端发来的数据
		 byte[] bs=new byte[1024];
		 //将数据存入bs数组中,返回值为数组的长度
		 int len=in.read(bs);
		 String str=new String(bs,0,len);
		 System.out.println("来自服务端的消息: "+str);
		//关闭流
		 so.close();
	}
}
           

客户端运行结果

连接服务器成功

来自服务端的消息: 欢迎访问,你好,我是服务端

服务端运行结果

服务器启动成功,等待用户接入

有客户端接入,客户端ip:/192.168.0.104

来自客户端的消息: 你好,我是客户端

服务端正常结束