大家给我写一个java socket的简单例子

大家给我写一个java socket的简单例子,第1张

客户端的。

String ip = "172311130";

ip = "127001";

int port = 10004;

try {

Socket socket = new Socket(ip, port);

socketsetSoTimeout(5539900);

javaioOutputStream out = socketgetOutputStream();

byte[] date = "hello world"getBytes();

outwrite(data);

outflush();

socketshutdownOutput();

byte[] buffer = new byte[1024];

int len = -1;

javaioFileOutputStream fout = new javaioFileOutputStream(

"d:/responsexml");

javaioByteArrayOutputStream bout = new javaioByteArrayOutputStream();

javaioInputStream in = socketgetInputStream();

while ((len = inread(buffer, 0, bufferlength)) > 0) {

boutwrite(buffer, 0, len);

}

inclose();

boutflush();

boutclose();

byte[] rdata = bouttoByteArray();

// Systemoutprintln("leen = " + (rdatalength - 32));

Systemoutprintln(new String(rdata));

foutwrite(rdata);

foutflush();

foutclose();

socketclose();

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

eprintStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

}

服务器端的

ServerSocket ss = new ServerSocket(8090);

Socket socket=null;

BufferedReader in;

PrintWriter out;

while (true)

{

socket = ssaccept();

in = new BufferedReader(new InputStreamReader(socketgetInputStream()));

out = new PrintWriter(socketgetOutputStream(),true);

String line = inreadLine();

outprintln("you input is :" + line);

outclose();

inclose();

socketclose();

}

分为两种模式:TCP和UDP

TCP有客户端(Client)和服务端(Server)的概念,服务端指定一个ip和端口(port)并且监听是否有客户端接入,客户端通过ip+port连接到服务端,通过socket得到输入输出流,他们之间的通信都是通过流(Stream)进行的,一个服务端可以接入多个客户端,客户端之间的通信依赖于服务端的转发。

UDP并没有严格的客户端和服务端的区别,你只需要建立一个socket指定你要发送的目标ip和port就行了,他是以数据包的形式发送数据(DataPacket),数据包里面存放的是byte[],有需要的话可补充具体实现源码

SERVER端:

--------------------------------------------------------

import javaioDataInputStream;

import javaioDataOutputStream;

import javaioIOException;

import javanetServerSocket;

import javanetSocket;

public class Server extends Thread {

    private Socket clientSocket;

    public Server(Socket clientSocket) {

        thisclientSocket = clientSocket;

    }

    public void run() {

        DataInputStream dis = null;

        DataOutputStream dos = null;

        try {

            dis = new DataInputStream(clientSocketgetInputStream());

            dos = new DataOutputStream(clientSocketgetOutputStream());

            while (true) {

                String temp = disreadUTF();

                if ("over"equals(temp)) {

                    break;

                }

                doswriteUTF("from server:" + temp);

            }

        } catch (Exception e) {

            eprintStackTrace();

        } finally {

            try {

                if (dis != null) {

                    disclose();

                }

                if (dis != null) {

                    dosclose();

                }

                if (clientSocket != null) {

                    clientSocketclose();

                }

            } catch (IOException e) {

            }

        }

    }

    public static void main(String[] args) throws Exception {

        ServerSocket ss = new ServerSocket(8008);

        while (true) {

            Socket clientSocket = ssaccept();

            // 针对每个客户端, 启一个Server线程专门处理此客户端的请求。

            Server server = new Server(clientSocket);

            serverstart();

        }

    }

}

CLIENT端:

----------------------------------------

import javaioBufferedReader;

import javaioDataInputStream;

import javaioDataOutputStream;

import javaioInputStreamReader;

import javanetSocket;

public class Client {

    public static void main(String[] args) throws Exception {

        // 输入流1, 从键盘进入Client。

        InputStreamReader isr = new InputStreamReader(Systemin);

        BufferedReader br = new BufferedReader(isr);

        Socket clientSocket = new Socket("127001", 8008);

        // 输入流2, 从服务器端进入Client的流对象。

        DataInputStream dis = new DataInputStream(clientSocketgetInputStream());

        // 输出流, 从Client出去, 到服务器端。

        DataOutputStream dos = new DataOutputStream(clientSocketgetOutputStream());

        while (true) {

            // 从键盘输入读取

            String msg = brreadLine();

            // 将读取信息发送给服务器端

            doswriteUTF(msg);

            //输入QUIT退出

            if ("QUIT"equals(msg)) {

                break;

            }

            //读取从服务器返回的信息

            String temp = disreadUTF();

            Systemoutprintln(temp);

        }

        brclose();

        disclose();

        dosclose();

        clientSocketclose();

    }

}

服务端:

ServerSocket serverSocket = new ServerSocket(2008);

while (true) {

Socket socket = serverSocketaccept();

MyThread thread = new MyThread(socket);

threadstart();

}public class MyThread extends Thread {

private Socket socket;

public MyThread(Socket socket) {

thissocket = socket;

}

@Override

public void run() {

superrun();

try {

InputStream is = socketgetInputStream();

BufferedReader bufReader = new BufferedReader(new InputStreamReader(is));

String line = "";

String s = "";

while ((s = bufReaderreadLine()) != null) {

line = line + s;

}

Systemoutprintln("接收到:" + line);

} catch (IOException e) {

eprintStackTrace();

}

}

}

客户端:

public static void main(String[] args) throws UnknownHostException, IOException {

Socket socket=new Socket("1921680101", 2008);

OutputStream out=socketgetOutputStream();

PrintWriter pw=new PrintWriter(new OutputStreamWriter(out));

pwprint("12345上山打老虎");

pwflush();

pwclose();

outclose();

}

程序清单 codes/ / /Client java

public class Client

{

public static void main(String[] args)

throws IOException

{

Socket socket = new Socket( )

//将Socket对应的输入流包装成BufferedReader

BufferedReader br = new BufferedReader(

new InputStreamReader(socket getInputStream()))

//进行普通IO *** 作

String line = br readLine()

System out println( 来自服务器的数据 + line)

//关闭输入流 socket

br close()

socket close()

}

}

上面程序中粗体字代码是使用ServerSocket和Socket建立网络连接的代码 斜体字代码是通过Socket获取输入流 输出流进行通信的代码 通过程序不难看出 一旦使用ServerSocket Socket建立网络连接之后 程序通过网络通信与普通IO并没有太大的区别

先运行上面程序中的Server类 将看到服务器一直处于等待状态 因为服务器使用了死循环来接受来自客户端的请求 再运行Client类 将可看到程序输出 来自服务器的数据 您好 您收到了服务器的新年祝福! 这表明客户端和服务器端通信成功

上面程序为了突出通过ServerSocket和Socket建立连接 并通过底层IO流进行通信的主题 程序没有进行异常处理 也没有使用finally块来关闭资源

实际应用中 程序可能不想让执行网络连接 读取服务器数据的进程一直阻塞 而是希望当网络连接 读取 *** 作超过合理时间之后 系统自动认为该 *** 作失败 这个合理时间就是超时时长 Socket对象提供了一个setSoTimeout(int timeout)来设置超时时长 如下的代码片段所示

Socket s = new Socket( )

//设置 秒之后即认为超时

s setSoTimeout( )

当我们为Socket对象指定了超时时长之后 如果在使用Socket进行读 写 *** 作完成之前已经超出了该时间限制 那么这些方法就会抛出SocketTimeoutException异常 程序可以对该异常进行捕捉 并进行适当处理 如下代码所示

try

{

//使用Scanner来读取网络输入流中的数据

Scanner scan = new Scanner(s getInputStream())

//读取一行字符

String line = scan nextLine()

}

//捕捉SocketTimeoutException异常

catch(SocketTimeoutException ex)

{

//对异常进行处理

}

假设程序需要为Socket连接服务器时指定超时时长 即经过指定时间后 如果该Socket还未连接到远程服务器 则系统认为该Socket连接超时 但Socket的所有构造器里都没有提供指定超时时长的参数 所以程序应该先创建一个无连接的Socket 再调用Socket的connect()方法来连接远程服务器 而connect方法就可以接受一个超时时长参数 如下代码所示

//创建一个无连接的Socket

Socket s = new Socket()

//让该Socket连接到远程服务器 如果经过 秒还没有连接到 则认为连接超时

s connconnect(new InetAddress(host port) )

       返回目录 疯狂Java讲义

       编辑推荐

       Java程序性能优化 让你的Java程序更快 更稳定

       新手学Java 编程

       Java程序设计培训视频教程

lishixinzhi/Article/program/Java/hx/201311/27265

是可以的,客户端可以多次运行,前提是服务器端必需采用多线程,或是非阻塞的方式来监听客户端的连接请求。服务器端 思想,当客户端连接到来时,利用这个socket创建一个新的线程,并启动。当然,这只不过是最简单的性能最差的方法。你可以使用线程池在javautilconcurrent包中有线程池的实现类Executors你可以通过它的ExecutorService executorService=ExecutorsnewFixedThreadPool(int threadSize);来创建一个线程池。当客户端连接到来时你可以创建一个线程类(handler)然后调用线程池的execute方法指行一个此线程。如:executorServiceexecute(new Handler(socket));。当然,如果你考虑性能,那么你最好使用nio(非阻塞)来处理,在javaniochannels包下面有相应的类能处理nio。你可以去查看相关的资料。。

以上就是关于大家给我写一个java socket的简单例子全部的内容,包括:大家给我写一个java socket的简单例子、java socket编程怎么实现、请问Socket编程的基本步骤是怎样的最好能写一个简单的程序Java演示一下,主要是接受数据。谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10163186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存