用JAVA写服务器端程序,只有自己的电脑可以连接上

用JAVA写服务器端程序,只有自己的电脑可以连接上,第1张

如果只有自己电脑连,局域网不能连,那有可能是端口没有开放,请关闭防火墙试试,

如果你想让外网的电脑访问,那你得有固定IP,(公网IP 或者用花生壳,域名转发,并且路由器需要做映射)

应该是不行的。Java有专门的

服务器

程序,只要你的类继承Serlvet或者

>

//ServerSocket

import javaio;

import javanet;

public class TcpServer {

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

        ServerSocket server = new ServerSocket(10003);

        Socket client = serveraccept();

        InputStream is = clientgetInputStream();

        OutputStream os = clientgetOutputStream();

        byte[] by = new byte[1024];

        int len = 0;

        String msg = null;

        while((len=isread(by))!=-1){

            msg = new String(by,0,len);

            Systemoutprintln("来自"+clientgetInetAddress()getHostAddress()+"客户端的消息:"+msg);

            if("886"equals(msg))

                break;

            oswrite(getPrint(msg));

        }

        clientclose();

    }

    private static byte[] getPrint(String msg){

        return msggetBytes();

    }

}//Socket

import javaio;

import javanet;

public class TcpClient {

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

        Socket sk = new Socket("localhost",10003);

        OutputStream os = skgetOutputStream();

        InputStream is = skgetInputStream();

        oswrite(getPrint());

        byte[] by = new byte[1024];

        int len = 0;

        while((len=isread(by))!=-1){

            Systemoutprintln("来自"+skgetInetAddress()getHostAddress()+"服务器的消息:"+new String(by,0,len));

            oswrite(getPrint());

        }

        skclose();

    }

    private static byte[] getPrint()throws Exception{

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

        String msg = inreadLine();

        return msggetBytes();

    }

}

//一下是输出结果:

来自127001客户端的消息:Hello

来自127001客户端的消息:eee

来自127001客户端的消息:886

//客户端:

Hello

来自127001服务器的消息:Hello

eee

来自127001服务器的消息:eee

886

提示:如果提问者想使用DataInputStream可以自行替换掉即可。

153 服务多个客户

JabberServer可以正常工作,但每次只能为一个客户程序提供服务。在典型的服务器中,我们希望同时能处理多个客户的请求。解决这个问题的关键就是多线程处理机制。而对于那些本身不支持多线程的语言,达到这个要求无疑是异常困难的。通过第14章的学习,大家已经知道Java已对多线程的处理进行了尽可能的简化。由于Java的线程处理方式非常直接,所以让服务器控制多名客户并不是件难事。

最基本的方法是在服务器(程序)里创建单个ServerSocket,并调用accept()来等候一个新连接。一旦accept()返回,我们就取得结果获得的Socket,并用它新建一个线程,令其只为那个特定的客户服务。然后再调用accept(),等候下一次新的连接请求。

对于下面这段服务器代码,大家可发现它与JabberServerjava例子非常相似,只是为一个特定的客户提供服务的所有 *** 作都已移入一个独立的线程类中:

//: MultiJabberServerjava

// A server that uses multithreading to handle

// any number of clients

import javaio;

import javanet;

class ServeOneJabber extends Thread {

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public ServeOneJabber(Socket s)

throws IOException {

socket = s;

in =

new BufferedReader(

new InputStreamReader(

socketgetInputStream()));

// Enable auto-flush:

out =

new PrintWriter(

new BufferedWriter(

new OutputStreamWriter(

socketgetOutputStream())), true);

// If any of the above calls throw an

// exception, the caller is responsible for

// closing the socket Otherwise the thread

// will close it

start(); // Calls run()

}

public void run() {

try {

while (true) {

String str = inreadLine();

if (strequals("END")) break;

Systemoutprintln("Echoing: " + str);

outprintln(str);

}

Systemoutprintln("closing");

} catch (IOException e) {

} finally {

try {

socketclose();

} catch(IOException e) {}

}

}

}

public class MultiJabberServer {

static final int PORT = 8080;

public static void main(String[] args)

throws IOException {

ServerSocket s = new ServerSocket(PORT);

Systemoutprintln("Server Started");

try {

while(true) {

// Blocks until a connection occurs:

Socket socket = saccept();

try {

new ServeOneJabber(socket);

} catch(IOException e) {

// If it fails, close the socket,

// otherwise the thread will close it:

socketclose();

}

}

} finally {

sclose();

}

}

} ///:~

每次有新客户请求建立一个连接时,ServeOneJabber线程都会取得由accept()在main()中生成的Socket对象。然后和往常一样,它创建一个BufferedReader,并用Socket自动刷新PrintWriter对象。最后,它调用Thread的特殊方法start(),令其进行线程的初始化,然后调用run()。这里采取的 *** 作与前例是一样的:从套扫字读入某些东西,然后把它原样反馈回去,直到遇到一个特殊的"END"结束标志为止。

同样地,套接字的清除必须进行谨慎的设计。就目前这种情况来说,套接字是在ServeOneJabber外部创建的,所以清除工作可以“共享”。若ServeOneJabber构建器失败,那么只需向调用者“掷”出一个违例即可,然后由调用者负责线程的清除。但假如构建器成功,那么必须由ServeOneJabber对象负责线程的清除,这是在它的run()里进行的。

请注意MultiJabberServer有多么简单。和以前一样,我们创建一个ServerSocket,并调用accept()允许一个新连接的建立。但这一次,accept()的返回值(一个套接字)将传递给用于ServeOneJabber的构建器,由它创建一个新线程,并对那个连接进行控制。连接中断后,线程便可简单地消失。

如果ServerSocket创建失败,则再一次通过main()掷出违例。如果成功,则位于外层的try-finally代码块可以担保正确的清除。位于内层的try-catch块只负责防范ServeOneJabber构建器的失败;若构建器成功,则ServeOneJabber线程会将对应的套接字关掉。

为了证实服务器代码确实能为多名客户提供服务,下面这个程序将创建许多客户(使用线程),并同相同的服务器建立连接。每个线程的“存在时间”都是有限的。一旦到期,就留出空间以便创建一个新线程。允许创建的线程的最大数量是由final int maxthreads决定的。大家会注意到这个值非常关键,因为假如把它设得很大,线程便有可能耗尽资源,并产生不可预知的程序错误。

//: MultiJabberClientjava

// Client that tests the MultiJabberServer

// by starting up multiple clients

import javanet;

import javaio;

class JabberClientThread extends Thread {

private Socket socket;

private BufferedReader in;

private PrintWriter out;

private static int counter = 0;

private int id = counter++;

private static int threadcount = 0;

public static int threadCount() {

return threadcount;

}

public JabberClientThread(InetAddress addr) {

Systemoutprintln("Making client " + id);

threadcount++;

try {

socket =

new Socket(addr, MultiJabberServerPORT);

} catch(IOException e) {

// If the creation of the socket fails,

// nothing needs to be cleaned up

}

try {

in =

new BufferedReader(

new InputStreamReader(

socketgetInputStream()));

// Enable auto-flush:

out =

new PrintWriter(

new BufferedWriter(

new OutputStreamWriter(

socketgetOutputStream())), true);

start();

} catch(IOException e) {

// The socket should be closed on any

// failures other than the socket

// constructor:

try {

socketclose();

} catch(IOException e2) {}

}

// Otherwise the socket will be closed by

// the run() method of the thread

}

public void run() {

try {

for(int i = 0; i < 25; i++) {

outprintln("Client " + id + ": " + i);

String str = inreadLine();

Systemoutprintln(str);

}

outprintln("END");

} catch(IOException e) {

} finally {

// Always close it:

try {

socketclose();

} catch(IOException e) {}

threadcount--; // Ending this thread

}

}

}

public class MultiJabberClient {

static final int MAX_THREADS = 40;

public static void main(String[] args)

throws IOException, InterruptedException {

InetAddress addr =

InetAddressgetByName(null);

while(true) {

if(JabberClientThreadthreadCount()

< MAX_THREADS)

new JabberClientThread(addr);

ThreadcurrentThread()sleep(100);

}

}

} ///:~

JabberClientThread构建器获取一个InetAddress,并用它打开一个套接字。大家可能已看出了这样的一个套路:Socket肯定用于创建某种Reader以及/或者Writer(或者InputStream和/或OutputStream)对象,这是运用Socket的唯一方式(当然,我们可考虑编写一、两个类,令其自动完成这些 *** 作,避免大量重复的代码编写工作)。同样地,start()执行线程的初始化,并调用run()。在这里,消息发送给服务器,而来自服务器的信息则在屏幕上回显出来。然而,线程的“存在时间”是有限的,最终都会结束。注意在套接字创建好以后,但在构建器完成之前,假若构建器失败,套接字会被清除。否则,为套接字调用close()的责任便落到了run()方法的头上。

threadcount跟踪计算目前存在的JabberClientThread对象的数量。它将作为构建器的一部分增值,并在run()退出时减值(run()退出意味着线程中止)。在MultiJabberClientmain()中,大家可以看到线程的数量会得到检查。若数量太多,则多余的暂时不创建。方法随后进入“休眠”状态。这样一来,一旦部分线程最后被中止,多作的那些线程就可以创建了。大家可试验一下逐渐增大MAX_THREADS,看看对于你使用的系统来说,建立多少线程(连接)才会使您的系统资源降低到危险程度。

Java作为编程语言中最受欢迎的一门语言,其地位是不容小觑的,要问它能做什么,如下:

一、做网站

Java可以用来做网站,很多大型网站都是用Java写的,比如我们熟悉的B站,所以想学习Java的同学还可以负责网站方面的制作,这方面的岗位(网站开发)也比较多,一直以来都相当流行。

二、做安卓软件

安卓是基于Linux的 *** 作系统,其中源代码就是Java,市面上所有的安卓手机都是修改Java运行的,对于更多的开发人员来说,他们更多的时间是花在开发APP上面。你随便打开一个App应用,他们就是用Java语言做的。

三、做游戏

电脑上的大多数游戏也是用Java来开发的,最经典的就是《我的世界》,还有当今世界最具影响力的游戏英雄联盟,吃鸡也是用Java写的

四、写软件

很多编程语言都是可以来写软件的,但Java是现在应用最广泛的,比如:企业级应用开发,还有OA、邮箱、物流、医疗、投票、金融、考试、矿山等信息方面的系统,Java都占有极为重要的地位。现在国内的最热门的就是手机应用,学习Java去做手机应用还是比较吃香的。

五、Java服务器程序

Java在金融服务业的应用非常广泛,许多跨国投资银行都用Java来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。

大多数情况下,Java被用在服务器端开发,但多数没有任何前端,它们通常是从一个服务器(上一级)接收数据,处理后发向另一个处理系统(下一级处理)。

六、Java大数据技术

Hadoop以及其他大数据处理技术都是用Java或者其他,Java 依旧还有潜力去在这个市场占据一部分。

第一处错误:

Systemoutprintln(“INFO:。。。。“ + thisport=" + ",operateStr + "" + thisoperateStr +""");// 错误,检查你的引号

改成

Systemoutprintln(“INFO:。。。。“ + thisport=" + ",operateStr + " + thisoperateStr + "");

第二处错误:

String[] dps = ipsplit("\"); // 需对\转义

改成

String[] dps = ipsplit("\\");

以上就是关于用JAVA写服务器端程序,只有自己的电脑可以连接上全部的内容,包括:用JAVA写服务器端程序,只有自己的电脑可以连接上、普通的Java程序能否直接在Tomcat等应用服务器/WEB服务器上运行、利用JAVA的ServerSocket和Socket编写客户、服务器程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存