Javaでのソケット通信の容量と増やし方
- Javaでソケット通信を行う際に、一度に送信できるデータの容量はどのくらいなのかについて説明します。
- また、データの容量を増やすための方法についても解説します。これにより、より大きなデータを送信することが可能になります。
- さらに、SEOを意識したハッシュタグもご紹介します。
- ベストアンサー
java でソケット通信をするとき
javaでソケット通信をするとき、 //データ受け取り byte[] buffer = new byte[2048]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } のようにしていますが、これだと文字数にして一度におくれる容量はどのくらいでしょうか? また、それらを増やすにはどうしたらいいでしょうか?
- nakisan2011_12
- お礼率72% (133/184)
- Java
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
一度に最大でどれくらい送れるのかは送信側の性能次第かと思います。 送信側が十分高性能であるならば受信用のバッファメモリ次第でしょうか。 今回のプログラムでは配列に格納しているので受け取れるのは最大2048バイトで Javaは内部でUTF-16を使用していますから1回で1024文字まで受け取れるようですね。 蛇足ですが、おそらく変数isはInputStreamかと思いますのでバイトストリームに なっています。「文字数にして」ということはテキストをやり取りするのでしょうか? テキストであればInputStreamReaderをつかってキャラクタストリームを 使用すると便利です。さらにBuffererdReaderを使用するとreadLine()メソッドで 改行までの1行単位で受信ができるようになります。 どんな単位でデータをやり取りするのかアプリケーションレベルでの通信プロトコルを 考える必要があります。 2048バイトなどの固定長?/改行までの行単位で可変長?などによって対応も変わって くるでしょう。 プログラムの目的によって変わってくるかと思います。
関連するQ&A
- javaのsocket通信で20KB以上の文字列を
javaのsocketについての質問です。サーバーとandroid端末で文字列のやりとりしています。 文字列は長いので、圧縮をかけ、android端末側で解凍を行っています。 そこで問題がおきました。文字データ量(20KB)が大きくなると、通信が完了せずに途中で止まってしまうのです。そこで文字列を分割(1KB毎)して送るなどを行い、しのいでおりましたが根本的の解決にはいたっていません。 InputStreamReader 、 BuffererdReader あたりを考えればいいと思うのですが、いまいち組み方がよくわからない状態です。 どなたか教えていただけないでしょうか? ============================= サーバー(PC側ソースコード)DataCompression は文字列を送って圧縮をかける独自のクラスです。 public class DataExchange extends Thread{ /* android端末とデータのやり取りをする */ private boolean DEBUG_FLAG = true; // private boolean DEBUG_FLAG = false; private InputStream is; private OutputStream os; private String sendStr; private String receiveStr; public DataExchange(InputStream is, OutputStream os, String sendStr) { this.is = is; this.os = os; this.sendStr = sendStr; } public void run() { //送信データ圧縮 DataCompression dc = new DataCompression(); byte[] sendByte = dc.getDataCompression(sendStr); //データ送信 try { os.write(sendByte); os.flush(); } catch (IOException e) { e.printStackTrace(); } if (DEBUG_FLAG) { System.out.println(os + " データ送信完了 = " + sendStr); } //データ受け取り byte[] buffer = new byte[1024]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } if (DEBUG_FLAG) { System.out.println(is + " データ受信完了 = " + receiveStr); } } public String getReceiveStr() { return receiveStr; } } ========================================= android端末側ソースコード public class DataExchange extends Thread{ /* android端末とデータのやり取りをする */ private InputStream is; private OutputStream os; private String sendStr; private String receiveStr; public DataExchange(InputStream is, OutputStream os, String sendStr) { this.is = is; this.os = os; this.sendStr = sendStr; } public void run() { //データ受け取り byte[] buffer = new byte[4096]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } /* 解凍 */ Inflater decompresser = new Inflater(); decompresser.setInput(buffer); int count; ByteArrayOutputStream decompos = new ByteArrayOutputStream(); while (!decompresser.finished()) { try { count = decompresser.inflate(buffer); decompos.write(buffer, 0, count); } catch (DataFormatException e) { e.printStackTrace(); } } receiveStr = decompos.toString(); System.out.println("データ受信完了 = " + receiveStr); //データ送信 try { byte[] sendByte = sendStr.getBytes("UTF8"); os.write(sendByte); os.flush(); } catch (IOException e) { e.printStackTrace(); } System.out.println("データ送信完了 = " + sendStr); } public String getReceiveStr() { return receiveStr; } }
- ベストアンサー
- Java
- TCP/IP通信について
現在、以下のようにTCP/IP通信のプログラミングを行っており、 サーバ/クライアント別々に4byteのデータ送信を10msec毎に10秒間行っております。 現在、WimdowsVista-Windows7間で各々をサーバ/クライアントとして順に起動し、 相互に4byte送信しているハズが、倍の8byteや12byteとデータが連なって送信されている 事象が発生してます。 OutputStreamではwrite後にflushを行っているので、flush契機でメモリ上に蓄えられた 送信用バッファが送信されるイメージでおりますが、4byteで送信できていないように見えます。 上記について、解決方法をご存じであればご教授お願い致します。 <Server.java> ===== public class Server { public static ServerSocket ss = null; public static Socket soc = null; private static InputStream is = null; private static OutputStream os = null; public static void main(String[] args) { try { // サーバソケット生成 ss = new ServerSocket(5000); soc = ss.accept(); is = soc.getInputStream(); os = soc.getOutputStream(); Thread rcvTh = new ServerRcvThread(is); rcvTh.start(); Thread sndTh = new ServerSndThread(os); sndTh.start(); // 10秒スリープ try{ Thread.sleep(10000); } catch ( Exception e){ e.printStackTrace(); } // スレッド停止 rcvTh.stop(); sndTh.stop(); } catch (IOException e) { e.printStackTrace(); } finally{ try { is.close(); os.close(); soc.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } } } } class ServerSndThread extends Thread{ private static OutputStream ous = null; ServerSndThread( OutputStream os ){ this.ous = os; } public void run(){ byte sndData[] = new byte[4]; sndData[0] = 0x01; sndData[1] = 0x02; sndData[2] = 0x03; sndData[3] = 0x04; try { while(true){ // データ書込み ous.write(sndData); ous.flush(); System.out.println("データ送信"); // 0.01秒スリープ try{ Thread.sleep(10); } catch ( Exception e){ e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } } class ServerRcvThread extends Thread{ private static InputStream ins = null; ServerRcvThread( InputStream os ){ this.ins = os; } public void run(){ byte rcvData[] = new byte[16]; int size = 0; try { while(true){ // データ読込み size = ins.read(rcvData); System.out.println("size:"+size+"byte"); } } catch (IOException e) { e.printStackTrace(); } } } ===== <Client.java> ===== public class Client { private static Socket soc = null; private static OutputStream os = null; private static InputStream is = null; public static void main(String[] args) { try { // ソケット生成 soc = new Socket("192.168.3.3", 5000); is = soc.getInputStream(); os = soc.getOutputStream(); Thread rcvTh = new ClientRcvThread(is); rcvTh.start(); Thread sndTh = new ClientSndThread(os); sndTh.start(); // 10秒スリープ try{ Thread.sleep(10000); } catch ( Exception e){ e.printStackTrace(); } // スレッド停止 rcvTh.stop(); sndTh.stop(); } catch (IOException e) { e.printStackTrace(); } finally{ try { is.close(); os.close(); soc.close(); } catch (IOException e) { e.printStackTrace(); } } } } class ClientSndThread extends Thread{ private static OutputStream ous = null; ClientSndThread( OutputStream os ){ this.ous = os; } public void run(){ byte sndData[] = new byte[4]; sndData[0] = 0x04; sndData[1] = 0x03; sndData[2] = 0x02; sndData[3] = 0x01; try { while(true){ // データ書込み ous.write(sndData); ous.flush(); System.out.println("データ送信"); // 0.01秒スリープ try{ Thread.sleep(10); } catch ( Exception e){ e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } } class ClientRcvThread extends Thread{ private static InputStream ins = null; ClientRcvThread( InputStream os ){ this.ins = os; } public void run(){ byte rcvData[] = new byte[16]; int size = 0; try { while(true){ // データ読込み size = ins.read(rcvData); System.out.println("size:"+size+"byte"); } } catch (IOException e) { e.printStackTrace(); } } } =====
- ベストアンサー
- Java
- javaについて
このプログラムは文字を入力して、検索をかけてその検索にかかった秒数を表示するものですが、検索数を表示するのにはどうしたらいいでしょうか? import java.io.*; import java.net.*; public class Sample { public static void main(String[] args) { System.out.println("入力してください"); String keyword = getKeyword(); String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=" + keyword, "UTF-8"); double sec = getSearchSec(htmlSrc); if (sec > 0) { System.out.println("検索秒数は" + sec + "秒"); } else { System.out.println("検索結果0件"); } } private static String getKeyword() { String keyword = ""; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); keyword = br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } keyword = keyword.replaceAll(" ", "+"); return keyword; } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } private static double getSearchSec(String htmlSrc) { double sec = 0; String tmp = htmlSrc.replaceAll("<.+?>| ", ""); tmp = tmp.replaceAll(".*件-", ""); tmp = tmp.replaceAll("秒.*", ""); try { sec = Double.parseDouble(tmp); } catch (NumberFormatException e) { } return sec; } }
- 締切済み
- Java
- javaについて
このプログラムは文字を入力して、検索をかけてその検索にかかった秒数を表示するものですが、検索数を表示するのにはどう書き換えますでしょうか? import java.io.*; import java.net.*; public class Sample { public static void main(String[] args) { System.out.println("入力してください"); String keyword = getKeyword(); String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=" + keyword, "UTF-8"); double sec = getSearchSec(htmlSrc); if (sec > 0) { System.out.println("検索秒数は" + sec + "秒"); } else { System.out.println("検索結果0件"); } } private static String getKeyword() { String keyword = ""; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); keyword = br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } keyword = keyword.replaceAll(" ", "+"); return keyword; } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } private static double getSearchSec(String htmlSrc) { double sec = 0; String tmp = htmlSrc.replaceAll("<.+?>| ", ""); tmp = tmp.replaceAll(".*件-", ""); tmp = tmp.replaceAll("秒.*", ""); try { sec = Double.parseDouble(tmp); } catch (NumberFormatException e) { } return sec; } }
- ベストアンサー
- Java
- javaについて
こういうプログラムを組んだんですが、うまく実行できません。 どんな改善をしたらよいでしょうか? import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class Sample { public static void main(String[] args) { String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=java", "UTF-8"); htmlSrc = htmlSrc.replaceAll("<.+?>| ", ""); htmlSrc = htmlSrc.replaceAll(".*件-", ""); htmlSrc = htmlSrc.replaceAll("秒.*", "秒"); System.out.println(htmlSrc); } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } 以下のエラーが表示されるんですが、どうしたらよいでしょうか?? 環境が悪いのでしょうか?? java.net.ConnectException: Operation timed out
- ベストアンサー
- Java
- JavaのTCPソケット通信プログラムについて
初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
- 締切済み
- Java
- java 検索数表示ができるようにしたいのですが
補足へ import java.io.*; import java.net.*; import java.lang.*; public class secc3 { public static void main(String[] args) { System.out.println("入力"); String keyword = getKeyword(); String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=" + keyword, "UTF-8"); String sec = getNumSearchHits(htmlSrc); sec = sec.replace(",",""); int ken = Integer.parseInt(sec); System.out.println(ken); if (ken > 0) { System.out.println("Hit数約" + ken + "件"); } else { System.out.println("結果0件"); } } private static String getKeyword() { String keyword = ""; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); keyword = br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } keyword = keyword.replaceAll(" ", "+"); return keyword; } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } private static String getNumSearchHits(String htmlSrc) { java.util.regex.Pattern p = java.util.regex.Pattern.compile(" / 約([,0-9]+)件 - "); java.util.regex.Matcher m = p.matcher(htmlSrc); return m.find() ? htmlSrc.substring(m.start(1), m.end(1)) : ""; } }
- 締切済み
- Java
- javaのソケット通信の受信で、InputStreamの終了が認識出来
javaのソケット通信の受信で、InputStreamの終了が認識出来ません。 (1)下記のネット上で見つけたチャットクライアントのソース"ChatClient.java"を流用しました。 http://www.saturn.dti.ne.jp/~npaka/android/SocketEx/index.html チャットサーバもこのサイトのソースを実装しました。この組み合わせで送受信は確認しました。 (2)これを下記のjavaのオープンソースを実装して、バイト読み出しに変更しました。 ・上記の元のソースの受信ループ中の読み出し部 size=in.read(w); → size=readsocket(w); 【"java\io\InputStream.java"より】 public int read(byte b[]) throws IOException { //※1 return read(b, 0, b.length); //※2 } public int readsocket2(byte b[], int off, int len) throws IOException {//※3 if (b == null) { throw new NullPointerException(); } else if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); //※4 if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = in.read(); if (c == -1) { break; } if (b != null) { b[off + i] = (byte)c; } } } catch (IOException ee) { } return i; } ・上記の名前の付け替え ※1:public int readsocket(byte b[]) throws IOException { ※2:return readsocket2(b, 0, b.length); ※3:public int readsocket2(byte b[], int off, int len) throws IOException { ※4:int c = in.read(); (3)この変更を行うと、“in.read()”でストリームの終了の"-1"が入って来ず、forループから抜けなくなってしまいました。帰って来るのは送信したコードのみです。どこが悪いのでしょうか?
- ベストアンサー
- Java
- ストリームの問題について【至急】
import java.io.*; public class FileStreamDemo { public static void main(String[] args){ try{ byte[] buffer=new byte[1024]; FileInputStream fileInputStream= new FileInputStream(new File(args[0])); FileOutputStream fileOutputStream= new FileOutputStream(new File(args[1])); System.out.println("コピーファイル: "+fileInputStream.available()+"バイト"); while(true){ if(fileInputStream.available()<1024){ int remain=-1; while((remain=fileInputStream.read())!=-1){ fileOutputStream.write(remain); } break; } else{ fileInputStream.read(buffer); fileOutputStream.write(buffer); } } fileInputStream.close(); fileOutputStream.close(); System.out.println("コピー完了"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println( "using:java FileStreamDemo src des"); e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } } JAVAの入門者です。 JAVAの教科書に書いてあるように、上のプログラムを書きましたけど… コンパイルすると、エラーメッセージが出て来ます。 エラー中身は下記のとおりです。 【using:java FileStreamDemo src des java.lang.ArrayIndexOutOfBoundsException: 0 at FileStreamDemo.main(FileStreamDemo.java:8) 】 どうすればいいのか悩んでいます。 誰か、助けていただけないのでしょうか?どこか間違ってるか、教えてください。 よろしく、お願いします。
- 締切済み
- Java
- Return で文字列が返せない、、
このような関数を作って、mainの関数に渡したいのですが、文法がダメだとコンパイラに怒られます。 private String test(){ try{ FileOutputStream fos=openFileOutput("sample.txt", MODE_PRIVATE); String text="サンプルテキストです"; fos.write(text.getBytes()); fos.close(); }catch(FileNotFoundException e){ }catch(IOException e){ } try{ FileInputStream fis=openFileInput("sample.txt"); byte buffer[]=new byte[100]; fis.read(buffer); String str = new String(buffer).trim(); fis.close(); return str; }catch(FileNotFoundException e){ }catch(IOException e){ } }なぜ返せないのでしょうか。
- ベストアンサー
- Java
お礼
ありがとうございます、実際は文字列をやりとりしているのですが文字数が増えるほど送れなくなったりすることが多いので、なぜかな、と思って質問しました。 InputStreamReader しらべてみます。